区别:
拷贝构造函数使用传入对象的值生成一个新的对象的实例,而拷贝赋值运算符是将对象的值复制给一个已经存在的实例。调用的是拷贝构造函数还是赋值运算符重载函数,主要是看是否有新的对象实例产生。 如果产生了新的对象实例,那调用的是拷贝构造函数,如果没有新的对象的实例产生那调用的是拷贝赋值运算符重载函数。
拷贝构造函数调用的主要场景:
- 对象作为函数的参数,以传递的方式传给函数;
- 对象作为函数的返回值,以值的方式从函数返回
- 使用一个对象给另一个对象初始化。
为什么要有拷贝构造函数,他和构造函数有什么区别?
拷贝构造函数本身也是构造函数,只不过其传入的形参是自身类型的对象的引用。如果类里面没有指针成员(该指针成员指向动态申请的内存空间),是没有必要编写拷贝构造函数的。
举个例子: 如果有一个类CObj,它已经产生了一个对象ObjA,现在想要创建另外一个对象ObjB,如果程序中使用ObjB=ObjA,也就是说直接使用ObjA的数据给ObjB赋值。对于一般的类,这样操作没有问题,但如果CObj里面有个成员char *pStr,用来存放动态申请的字符串的地址,那么此时如果使用 ** ObjB=ObjA **那么就会出现ObjA.pStr与ObjB.pStr指向同一块内存空间,这样就会导致这块空间由谁来释放的问题,如果释放两次就会出现段错误,使用拷贝构造函数就能解决此问题,因为拷贝构造函数是new出一块新的动态内存空间ObjB.pStr 来存放ObjA.pStr中的内容。所以说这里的“拷贝”拷贝的是动态申请的空间的内容,而不是类本身的数据,对于c++内置类型 int char double 等类型会直接拷贝,而对于动态内存开辟的类型要执行拷贝构造函数。
拷贝构造函数的参数是自身对象类型的引用,而不是对象指针,或者值 的原因是什么?
如果不是引用 ,那么在传入参数的时候是 以pass-by-value 的方式进行值传递的,那么就是触发拷贝构造函数的调用条件,执行拷贝构造函数,因为拷贝构造函数是值传递,从而造成无穷递归的调用拷贝构造函数,直到栈溢出或者程序崩溃。
- 本文标题:拷贝赋值运算符重载函数和拷贝构造函数的区别
- 创建时间:2023-09-09 15:45:56
- 本文链接:2023/09/09/拷贝赋值运算符重载函数和拷贝构造函数的区别/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!