C++“拷贝构造函数”和“等号重载”有什么区别

C++语言 码拜 9年前 (2016-05-18) 1897次浏览
CTypeA(const CTypeB& b)
CTypeA& operator=(const CTypeB& b)
一直没弄懂这两个有什么区别。
只知道,重载了=号,下面复制的时候就不调用拷贝构造函数了。

CTypeA a1;
CTypeB b1;
a1 = b1;

那什么时候会有区别?

class CTypeB
{
public:
	int b;
};
class CTypeA
{
public:
	int a;
	CTypeA(){}
	CTypeA(const CTypeB& b)
		:a(b.b)
	{
	}
	CTypeA& operator=(const CTypeB& b)
	{
		a = b.b;
		return *this;
	}
	operator CTypeB()
	{
		CTypeB b;
		b.b = a;
		return *this;
	}
};
解决方案

10

区别在于拷贝构造,主要用于以一个对象为模板,构造新对象,对象本身在这之前,是不存在的
operator= 主要是另外一个对象的内容,填充本对象
这个本对象,是已经构造好的现成对象。

30

首先要说明的是,若用户没有定义,C++隐式声明一个复制构造函数和一个赋值运算符(完成按数据成员复制的动作)。二者很像,但是在下边这点上有很大的不同:
复制构造函数是只在对象实例化时才会被调用,也就是说,在复制构造函数调用期间,这个对象处于一个未决状态(直到复制构造函数被成功调用),另外复制构造函数不返回任何值,void都没有。
拷贝构造函数应用的场合由以下几个方面:
1 函数的参数是一个对象,并且是值传递方式
2 函数的返回值是一个对象,并且是值传递方式
3 用一个对象初始化另外一个对象
赋值运算符则在一个现存的对象被赋予新的值时被调用,并且它有返回值。
http://blog.csdn.net/swgsunhj/article/details/37871249

30

正所谓其名,拷贝构造函数是在构造对象的时候用,而等号重载则在在赋值的时候用
CTypeA a;
CTypeA b(a);  //在构造b
CTypeA b = a; //在构造b
b = a; //在赋值

20

A a2 = a1;//这个,会根据类的实现,采用不同的方案,可能会调用拷贝构造函数,也可能先构造,后调用operator =
A a2(a1);//这个直接调用构造函数初始化
本人记着是这样的

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++“拷贝构造函数”和“等号重载”有什么区别
喜欢 (1)
[1034331897@qq.com]
分享 (0)