Почему не вызывается конструктор копирования
в операторе strin z=x+y должен быть вызван конструктор копирования ....так как x+y возвращает строку .приведенное выше утверждение должно вызывать конструктор копирования....но оно не вызывается....я пропустил какое-то понятие о конструкторе копирования
Что я уже пробовал:
#include <iostream> #include<string.h> using namespace std; class strin { int len; char *p; public: strin(){len=0;p=NULL;} strin( const char *s){cout<<"cons is called\n"; len=strlen(s); p=new char[len+1]; strcpy(p,s); } strin( const strin &s) { len=s.len; p=new char[len+1]; strcpy(p,s.p); } ~strin() { delete p; cout<<"des is called\n"; } strin operator +( const strin &obj ) { strin temp; temp.len =obj.len+len; temp.p=new char[temp.len]; strcpy(temp.p,p); strcat(temp.p,obj.p); return temp; cout<<"opr is called"<<"\n"; } void print(void) { cout<<p<<"\n"; } }; int main() { strin x="hello"; strin y="bob"; strin z=x+y; z.print(); }
Kornfeld Eliyahu Peter
Почему? Вы уже сконструировали обе ваши переменные!!!
0x01AA
Но как насчет возвращаемого значения для operator+
Здесь я ожидал бы вызова конструктора копирования....
Member 12914219
вот что я говорю
0x01AA
Просто протестировал его и нашел (с помощью отладчика и точки останова в Operator+ и конструкторе копирования. В моем случае он вызовет конструктор копирования.
Member 12914219
я узнал, что конструктор копирования вызывается, когда новый объект создается из существующего объекта....например, strin obj1=obj2;....утверждение strin z= x+y равно strin z=(некоторый объект)...я думаю, что следует вызвать конструктор копирования
Richard MacCutchan
неправильный.
Member 12914219
я знаю, но моя операторная функция возвращает объект ... так что strin z=(object)
должен вызвать конструктор копирования...... и еще одна вещь ..если я объявлю объект, а затем использую его ...он не добавит две строки ..есть какое-то мусорное значение.... ex
тап_п()
{
strin x="привет";
Стрин г="Вася";
Стрин з;
z=x+y;
з.печать();
}
0x01AA
Ошибаешься! В то время как оператор return fro+ существует необходимость вызвать конструктор копирования для возвращаемого значения.
0x01AA
Просто сделайте это, и конструктор копирования будет вызван, и должен быть вызван, потому что локальная переменная "стека" не может быть возвращена без создания копии... обычно...
Richard MacCutchan
Мой тест провалился из-за ошибки в исходном коде. Я исправился.