Теория
От: Diman  
Дата: 22.06.01 11:04
Оценка:
Привет всем.

Кто в теории может объяснить пример (компилируется, но падает)

#include <stdio.h>

class X
{
public:
X(int num)
{
px=new int;
*px=num;
}

int* px;

~X()
{
delete px;

}
};

void Print(X x)
{
printf("%d\n",*(x.px) );
}

int main(int argc, char* argv[])
{
X y(6);

Print (y);


return 0;
}
Re: Теория
От: wvk Россия  
Дата: 22.06.01 11:41
Оценка:
Параметр в Print передаётся по значению, а не по ссылке
"конструктор копирования по умолчанию" копирует указатель в локальную копию — параметр.
Деструктор этой копии удаляет px.
Затем, в конце main указатель px удаляется ещё раз.

Вывод: Передавайте такие объекты по ссылке.
Re[2]: Теория
От: IT Россия linq2db.com
Дата: 22.06.01 14:22
Оценка:
wvk>Вывод: Передавайте такие объекты по ссылке.
или объявляйте конструктор копирования и оператор присваивания
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Теория
От: The Lex Украина  
Дата: 25.06.01 07:56
Оценка:
Здравствуйте IT, вы писали:

IT>или объявляйте конструктор копирования и оператор присваивания


Кстати: кто-нибудь даст пример оператора присваивания? Нужно определять эти операторы для всех типов "слева" или они сами будут разбираться, кого куда переопределять?
Голь на выдумку хитра, однако...
Re[4]: Теория
От: IT Россия linq2db.com
Дата: 25.06.01 11:46
Оценка:
TL>Кстати: кто-нибудь даст пример оператора присваивания? Нужно определять эти операторы для всех типов "слева" или они сами будут разбираться, кого куда переопределять?

Слева — это уже не оператор присваивания, а оператор преобразавания к типу получается.
Примеров полно в *.h файлах MFC и др. библиотек, возми хотя бы CString, там и operator=() и operator sometype() найдёшь.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Теория
От: Willi  
Дата: 25.06.01 12:23
Оценка:
Здравствуйте The Lex, вы писали:

TL>Здравствуйте IT, вы писали:


IT>>или объявляйте конструктор копирования и оператор присваивания


TL>Кстати: кто-нибудь даст пример оператора присваивания? Нужно определять эти операторы для всех типов "слева" или они сами будут разбираться, кого куда переопределять?


class MyClass
{
public:
MyClass() {}
MyClass(const MyClass& src); // это конструктор копирования
MyClass& operator=(const MyClass& src); // это оператор присваивания

...
};

MyClass::MyClass(const MyClass& src)
{
...
}

MyClass& MyClass::operator=(const MyClass& src)
{
...
return *this;
}


MyClass c1;
MyClass c2(c1); // вызов конструктора копирования у с2
c1 = c2; // вызов оператора присваивания у с1

MyClass c3 = c2; // не уверен, но мне кажется тоже вызов конструктора копирования у с3
\/\/i||i
Re[5]: Теория
От: Sergei  
Дата: 26.06.01 11:23
Оценка:
Здравствуйте 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 то будет вызываться конструктор копии,
а если нет то оператор присваивания.
Re[6]: Теория
От: Willi  
Дата: 26.06.01 11:29
Оценка:
Здравствуйте Sergei, вы писали:

W>>MyClass c3 = c2; // не уверен, но мне кажется тоже вызов конструктора копирования у с3

S>Если конструктор не объявлен как explicit то будет вызываться конструктор копии,
S>а если нет то оператор присваивания.

О! Век живи, век учись :)
Бум знать.

Спасибо!
\/\/i||i
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.