拷贝构造:一种特殊的构造函数,具有一般构造函数的所有特性,其形参是本类的对象的引用,其作用是使用一个已经存在的对象,去初始化同类的一个新对象
调用拷贝构造的三种情况:
(1)用类的一个对象去初始化类的另一个对象
(2)函数的参数为类对象,调用函数时从实参值传递给形参的过程,用实参去构造初始化形参
(3)函数的返回值是类对象
因为局部对象在离开简历它的函数体时就消亡了,不可能在返回调用函数后继续生存,所以编译系统会在调用函数的表达式中创建一个无名临时对象,该临时对象只在函数调用处的表达式中,所谓返回return对象,实际上是调用拷贝构造函数把该对象的值拷入到临时对象
#include<iostream>
using namespace std;
class Test
{
public:
Test(int value = 0)
{
cout<<"Test construct"<<endl;
}
Test(const Test &t)
{
cout<<"Test copy construct"<<endl;
data = t.data;
}
~Test()
{}
int getdata()
{return data;}
private:
int data;
};
Test fun(Test x)
{
int value;
value = x.getdata();
value;
Test tmp(value); //调用拷贝构造的第三种情况
return tmp;
}
void main()
{
Test t; //调用拷贝构造的第一种情况
fun(t); //调用拷贝构造的第二种情况
}
所谓浅拷贝,指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。大多情况下“浅拷贝”已经能很好地工作了,但是一旦对象存在了动态成员,那么浅拷贝就会出问题了
对于对象中有动态成员的,那就不能仅仅简单地赋值了,而应该重新动态分配空间
即“深拷贝”,
对拷贝构造中还应注意以下问题:
(1)一个类中可以存在多于一个的拷贝构造函数,普通拷贝构造和+const的拷贝构造
(2)如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。这个默认的参数可能为 X::X(const X&)或 X::X(X&),由编译器根据上下文决定选择哪一个。