2 weixin 34703558 weixin_34703558 于 2016.04.19 22:49 提问

关于复制构造函数跟赋值运算符重载

新手求指导 关于两个函数不太理解 复制构造的是同一个内存地址吗 为什么要重载赋值运算符

3个回答

NK_test
NK_test   Rxr 2016.04.19 23:42
已采纳

赋值运算符和复制构造函数都是用已存在的B对象来创建另一个对象A。不同之处在于:赋值运算符处理两个已有对象,即赋值前B应该是存在的;复制构造函数是生成一个全新的对象,即调用复制构造函数之前A不存在。
CTemp a(b); //复制构造函数,C++风格的初始化
CTemp a=b; //仍然是复制构造函数,不过这种风格只是为了与C兼容,与上面的效果一样
在这之前a不存在,或者说还未构造好。
CTemp a;
a=b; //赋值运算符
在这之前a已经通过默认构造函数构造完成。

而之所以要自定义这些,是因为防止有指针时浅拷贝造成错误。具体可百度 rule of three原则

caozhy
caozhy   Ds   Rxr 2016.04.19 23:43

因为默认的复制构造函数是浅拷贝。比如说如下类
class Person
{
public:
char * Name;
int Age;
};
默认的构造函数在拷贝的时候,会创建一个新的对象,并且拷贝Name和Age的值,两个对象各自有一个Age,但是两个对象各自只有一个Name的指针,指向了同一个字符串对象。所以你需要自己实现拷贝构造函数,用malloc为第二个对象分配新的空间,用strcpy真正拷贝出一个新的Name来。

CSDNXIAOC
CSDNXIAOC   2016.04.19 22:52

#include
#include
#include
#include
using namespace std;
class My
{
public:
My()
{
n = 0;
arr = NULL;
cout......
答案就在这里:复制构造函数和重载赋值运算符
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!