同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对象是可用同一类的另一个对象来初始化该对象,这时所用的构造函数称为拷贝构造函数。
四少:构造函数,拷贝构造函数,赋值函数,析构函数
#include <iostream>
using namespace std;
class Test
{
public:
//Test t
Test(int d = 0):data(d)
{
cout<<"create Test object: "<<this<<endl;
}
//Test t1(t)
Test(const Test &t) //拷贝构造函数
{
cout<< "copy create Test obeject: "<<this<<endl;
data = t.data;
}
//t3 = t1
Test& operator=(const Test &t) //赋值语句
{
cout<<"Assign:"<< this<<" = "<<&t<<endl;
if(this != &t){
data = t.data;
}
return *this;
}
//~t
~Test()
{
cout<<"free Test object: "<<this<<endl;
}
private:
int data;
};
int main()
{
Test t(10);
Test t1(t);
Test t2 = t1; //调动 拷贝构造函数 //初始化
Test t3;
t3 = t1; //赋值
return 0;
}
拷贝构造函数的参数–采用引用。如果把一个真实的类对象作为参数传递到拷贝构造函数,会引起无穷递归。
系统会自动提供,称为缺省的按成员语义支持的拷贝构造函数,每个类成员被依次拷贝,称为缺省的安城员初始化。按成员作拷贝是通过依次拷贝每个数据成员实现的,而不是对整个类对象按位拷贝。赋值运算符“=”称缺省的按成员拷贝赋值操作符,同类对象之间可以用“=”直接拷贝。
通常按成员语义支持已经足够。但在某些情况下,它对类与对象的安全性和处理的正确性还不够,这时就要求类的设计者提供特殊的拷贝构造函数和拷贝赋值操作符的定义。
Test t1 (10);
Test t2 = t1;
<==>
Test t2(t1) ; //初始化
默认拷贝构造函数 工作:把类的成员按对应方式一一进行拷贝赋值.
3种拷贝构造函数的使用:
1.对象初始化对象
2.当函数的形参是类对象,调用函数时,进行形参于实参拷贝到新对象种。
3.当函数的返回值是类对象,函数执行完成返回调用者时使用。理由也是要建立一个临时对象中,再返回调用者。
因为局部对象在离开建立他的函数时就消亡了,不可能在返回调用函数后继续生存,所以在处理这种情况时,编译系统会在调用函数的表达式中创建一个无名临时的对象,该临时对象的生命周期只是在函数调用处的表达式中。所谓retrun对象,实际上时调用拷贝构造函数把该对象的值拷入临时对象。如果返回的是变量,处理过程类似,只是不掉用构造函数
Test fun(Test x)
{
int value ;
value = x.getdata();
Test tmp(value);
return tmp;
}