复制构造函数
复制构造函数,又称拷贝构造函数。
是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:
- 通过使用另一个同类型的对象来初始化新创建的对象。
- 复制对象把它作为参数传递给函数。
- 复制对象,并从函数返回这个对象。
如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下:
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对象