預設拷貝建構函式和預設賦值函式
阿新 • • 發佈:2018-12-12
當一個類中有動態分配記憶體時,應當自己定義拷貝建構函式和賦值函式
class A
{
int *p;
public:
A()
{
p = new int[10];
}
~A()
{
delete p;
}
};
void f(A x)
{
cout << "Yes" << endl;
}
int main()
{
A a;
f(a);
}
執行時出錯,因為f(a)時呼叫了拷貝建構函式(簡單的複製,p=x.p),當f(a)結束時會呼叫x的解構函式,delete p,而a到了生命週期後也會呼叫解構函式,delete 已經被delete的p; 修改為:
class A
{
int *p;
public:
A()
{
p = new int[10];
}
~A()
{
delete p;
}
A(A &x)
{
p = new int[10];
*p = *(x.p);
}
};
void f(A a)
{
cout << "Yes" << endl;
}
int main()
{
A a;
f(a);
}
預設賦值函式同理