Параметр в Print передаётся по значению, а не по ссылке
"конструктор копирования по умолчанию" копирует указатель в локальную копию — параметр.
Деструктор этой копии удаляет px.
Затем, в конце main указатель px удаляется ещё раз.
Здравствуйте IT, вы писали:
IT>или объявляйте конструктор копирования и оператор присваивания
Кстати: кто-нибудь даст пример оператора присваивания? Нужно определять эти операторы для всех типов "слева" или они сами будут разбираться, кого куда переопределять?
TL>Кстати: кто-нибудь даст пример оператора присваивания? Нужно определять эти операторы для всех типов "слева" или они сами будут разбираться, кого куда переопределять?
Слева — это уже не оператор присваивания, а оператор преобразавания к типу получается.
Примеров полно в *.h файлах MFC и др. библиотек, возми хотя бы CString, там и operator=() и operator sometype() найдёшь.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте The Lex, вы писали:
TL>Здравствуйте IT, вы писали:
IT>>или объявляйте конструктор копирования и оператор присваивания
TL>Кстати: кто-нибудь даст пример оператора присваивания? Нужно определять эти операторы для всех типов "слева" или они сами будут разбираться, кого куда переопределять?
class MyClass
{
public:
MyClass() {}
MyClass(const MyClass& src); // это конструктор копирования
MyClass& operator=(const MyClass& src); // это оператор присваивания
Здравствуйте Willi, вы писали:
W>Здравствуйте The Lex, вы писали:
TL>>Здравствуйте IT, вы писали:
IT>>>или объявляйте конструктор копирования и оператор присваивания
TL>>Кстати: кто-нибудь даст пример оператора присваивания? Нужно определять эти операторы для всех типов "слева" или они сами будут разбираться, кого куда переопределять?
W>class MyClass W>{ W>public: W> MyClass() {} W> MyClass(const MyClass& src); // это конструктор копирования W> MyClass& operator=(const MyClass& src); // это оператор присваивания
W> ... W>};
W>MyClass c1; W>MyClass c2(c1); // вызов конструктора копирования у с2 W>c1 = c2; // вызов оператора присваивания у с1
W>MyClass c3 = c2; // не уверен, но мне кажется тоже вызов конструктора копирования у с3
Если конструктор не объявлен как explicit то будет вызываться конструктор копии,
а если нет то оператор присваивания.
Здравствуйте Sergei, вы писали:
W>>MyClass c3 = c2; // не уверен, но мне кажется тоже вызов конструктора копирования у с3 S>Если конструктор не объявлен как explicit то будет вызываться конструктор копии, S>а если нет то оператор присваивания.