C++对象的赋值和复制

时间:2022-04-26
本文章向大家介绍C++对象的赋值和复制,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本文属于上篇博文《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);
}