复制构造函数VS赋值操作符重载

复制构造函数

复制构造函数,又称拷贝构造函数。
是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:

  • 通过使用另一个同类型的对象来初始化新创建的对象。
  • 复制对象把它作为参数传递给函数。
  • 复制对象,并从函数返回这个对象。

如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下:

classname (const classname &obj) {
   // 复制构造函数的主体
}

赋值操作符重载

A& operator=(const A& obj){
	//..
}

语句“ClassA obj2; obj2 = obj1;“ 和语句“ClassA obj2 = obj1;”在调用函数上是有区别的:前者第一句是对象obj2的声明及定义,调用类ClassA的无参构造函数,所以“obj2 =
obj1;”一句是在对象obj2已经存在的情况下,用obj1来为obj2赋值,调用的是赋值运算符重载函数;而后者,是用obj1来初始化obj2,调用的是拷贝构造函数。关于拷贝构造函数的语句样式为“ClassA(const ClassA& cls)”

所以:

A obj1;
A obj2;
obj2 = obj1;//调用赋值操作符重载函数
//而
A obj3 = obj1;//调用复制构造函数,
//相当于 A obj3(obj1);

测试例子

测试环境:VS2013

class Student{
public :
	Student(){
		cout << "构造函数\n";
	}
	~Student(){
		cout << "析构函数\n";
	}
	//复制构造函数
	Student(const Student& s) {
		cout << "复制构造函数\n";
	}
	//赋值操作符重载
	Student& operator=(Student& s){
		cout << "赋值操作符重载\n";
		return s;
	}
};

Student fun1(Student s){
	int i = 10;
	Student s2;
	return s2;
}

int main(void)
{
	Student s1;
	Student s2;
	s2 = fun1(s1);

	return 0;
}

//结果如下:

构造函数			main:s1 		0x004ff97f
构造函数			main:s2 		0x004ff973
复制构造函数		fun1按值传参s1 	0x004ff868
构造函数			fun1中的s2		0x004ff83b
复制构造函数		fun1返回对象		0x004ff89b
析构函数						   ~0x004ff83b  析构fun1中的s2对象
析构函数						   ~0x004ff868	析构fun1按值传参的s1对象
赋值操作符重载					   
析构函数						   ~0x004ff89b  赋值后析构fun1返回的临时对象
析构函数						   ~0x004ff973  析构main中的s1对象
析构函数						   ~0x004ff97f  析构main中的s2对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值