以上两篇文章讲了拷贝构造函数与赋值构造函数
看以下代码:
#include <iostream>
using namespace std;
class A
{
public:
A(int _size) : size(_size){ data = new int[size]; } //假如其中有一段动态分配的内存
int Get_Val() {return *data;}
int *Get_Val_add() { return data; }
A() {}
A( const A& _A) : size(_A.size){ data = new int[size]; } //深拷贝
~A(){delete[] data; data = NULL; } //析构时释放资源
private:
int *data;
int size;
};
int main()
{
A a(5);
A b;
b = a;
cout << b.Get_Val() << endl;
return 0;
}
以上代码虽然自己写了拷贝构造函数,进行了深拷贝,但是在运行的时候还是会出错,会造成crash,原因为 “b = a”造成的,在这里得重载运算符“=”。(赋值构造函数) 因为 执行“b = a”,并没有调用到事先定义的拷贝构造函数, 如果将“b = a”改为 A b(a)或者A b = a之后就可以成功运行了。
代码改正如下
#include <iostream>
using namespace std;
class A
{
public:
A(int _size) : size(_size){ data = new int[size]; } //假如其中有一段动态分配的内存
int Get_Val() {return *data;}
int *Get_Val_add() { return data; }
A() {}
A( const A& _A) : size(_A.size){ data = new int[size]; } //深拷贝
A& operator = ( const A& _A){ size= _A.size; data = new int[size]; return *this; } //深拷贝
//A& operator = ( const)
~A(){delete[] data; data = NULL; } //析构时释放资源
private:
int *data;
int size;
};
int main()
{
A a(5);
A b;
b = a;
cout << b.Get_Val() << endl;
return 0;
}
重载了运算符“=" 之后可以成功执行了。