1. C++默认实现了 = 号赋值;operator=只要将一个对象的内容的内容逐位复制给另外一个对象即可。
2. C++默认实现了复制构造函数;同样,只要将一个对象的内容的内容逐位复制给另外一个对象即可。
3. 默认实现的复制构造函数属于浅拷贝。当对象里面有指针的时候,第二个对象的指针并没有重新分配空间,这时如果析构函数delete了这个指针,会造成重复delete。
这个时候,要自己实现复制构造函数,在构造函数中new重新分配空间,并可用memcpy手动复制该空间的值。
4. = 号操作符也可以自己实现;
使用默认的 = 操作符以及默认的复制构造函数的例子:
#include <iostream> using namespace std; class Demo { public: int x ; int y ; }; int main() { Demo demo1; demo1.x = 11; demo1.y = 111; Demo demo2; demo2 = demo1;//默认的等号赋值,属于浅拷贝。但对象成员没有指针变量时,无需顾虑。 cout<<"demo2-----"<<demo2.x<<endl; cout<<"demo2-----"<<demo2.y<<endl; Demo demo3(demo1);//默认的复制构造函数,属于浅拷贝。可以自己实现,Demo::Demo(Demo& val);
cout<<"demo3-----"<<demo3.x<<endl; cout<<"demo3-----"<<demo3.y<<endl; while(1); return 0 ; }
/**结果:
demo2 x-----11
demo2 y-----111
demo3 x-----11
demo3 y-----111
*/
下面是自己实现复制构造函数的例子:
#include <iostream> using namespace std; class Demo { public: int x ; int y ; Demo(); Demo(Demo& val); }; Demo::Demo() { } Demo::Demo(Demo& val) //自己实现拷贝构造函数 { this->x = val.x +1;//故意+1以示区分 this->y = val.y +1; } int main() { Demo demo1; demo1.x = 11; demo1.y = 111; Demo demo2; demo2 = demo1;//等号赋值,属于浅拷贝 cout<<"demo2 x-----"<<demo2.x<<endl; cout<<"demo2 y-----"<<demo2.y<<endl; Demo demo3(demo1);// cout<<"demo3 x-----"<<demo3.x<<endl; cout<<"demo3 y-----"<<demo3.y<<endl; while(1); return 0 ; } /*测试结果: demo2 x-----11 demo2 y-----111 demo3 x-----12 demo3 y-----112 */