复制构造函数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对象

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页