本文属于上篇博文《C++区别于其他语言的知识点总结》第13小节。
13.对象的赋值和复制
对象的赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号运算符实现,实际上这个过程是通过成员赋值(mewberwise copy)实现的,即将一个对象的成员一一赋值给另一对象的对应成员。注意:对象的赋值只是对其中数据成员的赋值,而不是对成员函数赋值。
对象1 = 对象2;//浅拷贝 浅复制
Box *b1 = new Box(1, 2, 3); //C++类Java对象声明 必须使用指针
Box *b2;
b1 = b2; //浅拷贝
delete b1;
delete b2;//同一块地址 删了2次
Box b1 = Box(1, 2, 3);
Box b2;
b2 = b1;//位复制方式给b2赋值 想当于b1的内存完全copy给b1
//当这里给b2赋值时,回到时b2的p指针和b1的p指针指向同一个地方 即b1的p
//当程序运行结束时,会导致同一个内存在各自的析构函数中释放,累计释放了2次。
//深拷贝 深复制
补充:深拷贝和浅拷贝的区别:
https://www.zhihu.com/question/36370072
对象的复制:用一个已有的对象快速地多个完全相同的对象。
//对象赋值:两个对象都已经存在,然后用一个对象给另一个对赋值
//对象复制:已经有一个对象,再创建另一个对象时,用已知的对象初始化创建对象
对象复制的一种形式:
Box box2(box1);//类名 对象2(对象1);
//用对象1复制出对象2 建立对象时调用了一个特殊的构造函数——copy构造函数(copy constructor)
//the copy constructor definition 详见课本101页
Box :: Box(const Box&b) {
height = b.height;
width = b.width;
length = b.length;
}
对象复制的另一种形式:
Box box2 = box1;//类名 对象1 = 对象2;
两者区别:
对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行对象的赋值。而对象的复制则是从无到有地建立一个新对象,并使它与一个已有的对象的完全相同(包括对象的结构和成员的值)。
c3 = c1.complex_add(c2);//此处存在对象的赋值和复制问题
//对象的复制,存在于实参到形参以及函数的返回中
//实现机制实例
//重载=号实现对象赋值
Person& operator= (Person &s) {
puts("oper");
if(this == &s) return s;
char *t = new char[srelen(s.p) + 1];
strcpy(t, s.p);
delete []p;
p = t;
return this*;
}
//Copy构造函数实现对象复制
Person (const Person& s) {
puts("cp cntr");
p = new char[strlen(s.p) + 1];
strcpy(p, s.p);
}