C++默认的复制构造函数是怎么走的?

classA{……A(A&a)……};A(A&a){*this=a;}这里的默认的复制构造函数功能就是把对象a对当前调用对象做复制,但是类是构造数据,为什么可以像基本数据... class A
{……
A(A& a)
……};
A(A& a)
{
*this=a;
}
这里的默认的复制构造函数功能就是把对象a对当前调用对象做复制,但是类是构造数据,为什么可以像基本数据类型(比如int型)直接做赋值运算呢?
展开
 我来答
wilypcabc
2010-05-18 · TA获得超过282个赞
知道答主
回答量:72
采纳率:100%
帮助的人:0
展开全部
这是因为类有一个默认的赋值操作符,虽然你没写,编译器已经为你自动生成了,大概如下:
A& operator=(A& a)
{
this->XXX = a.XXX; //把a的成员变量值都拷贝给这个对象的成员变量
....
return *this;
}

ps.如果你的类里面有指针成员变量,你就必须重写拷贝构造函数和赋值操作符。因为你不重写的话,就会调用默认的拷贝构造函数和赋值操作符,而默认的是成员变量按位拷贝,所以就会导致两个类对象的指针变量同时指向一块内存。

下面是一道很经典的面试题,就是关于这个问题的。在这题里面,就必须重写拷贝构造函数和赋值操作符。你可以自己写下,对你理解这个很有帮助。

已知类String的原型为:
class String
{
public:
String(const char *str = NULL); // 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operate =(const String &other); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
请编写String的上述4个函数。
_xshane
2010-05-18 · 超过13用户采纳过TA的回答
知道答主
回答量:34
采纳率:0%
帮助的人:0
展开全部
实质上类间的赋值运算是类内部默认的一个重载赋值号运算符的函数,将一个对象赋值给另外一个对象或者是复制一个对象给另外一个对象,只是将对象的数据拷贝一份给另外的对象,两者有同样的内存大小空间,但是各自对应着不同的内存空间!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
422958286
2010-05-18 · TA获得超过902个赞
知道小有建树答主
回答量:228
采纳率:0%
帮助的人:166万
展开全部
不是说类的赋值,是类中相关的成员按照模板的来赋值。用一个对象来初始化另外一个对象时,是把对象的数据成员都复制到另外一个对象。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
历竹时棋
2019-05-06 · TA获得超过3.7万个赞
知道小有建树答主
回答量:1.2万
采纳率:28%
帮助的人:1012万
展开全部
系统会自动生成的函数有:
默认构造函数
析构函数
拷贝构造函数
赋值运算符(operator=)
取址运算符(operator&)(一对,一个非const的,一个const的)
如果你没有定义复制构造函数,系统会为你生成一个默认的复制构造函数,但是,当你的类含有指针类型的私有数据成员时,默认的复制构造函数是危险的,因为它使两个对象的指针都指向了同一块内存区域,这时便是浅拷贝了。当你含有指针类型的私有数据成员时,必须得使用深拷贝。
你可以搜一下关于浅拷贝和深拷贝的区别。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式