拷贝构造函数是c++最为基础的概念之一,大家自认为对拷贝构造函数了解么?那么请先回答三个问题,就知道了!
1、以下函数哪个是 拷贝构造函数,为什么?
1 X::X(const X&); 2 X::X(X); 3 X::X(X &,int a=1); 4 X::X(X &,int a=1,b=2);
2、一个类中可以存在多余一个的拷贝构造函数吗??
3、写出一下程序段的输出结果,并说明为什么?如果说你都回答对了,那就赶快离开这里吧!!这里不是你的栖息之地!
答案:
1、对于一个类X,如果一个构造函数的第一个参数是下列之一:
a)X&
b)const X&
c)volatile X&
d)const volatile X&
且没有其他参数或其他参数都是有默认值,那么这个函数是拷贝构造函数
1 X::X(const X&)//拷贝构造函数 2 X::X(X&,int a=1)//拷贝构造函数
2、类中可以存在超过一个拷贝构造函数
1 class X 2 { 3 public: 4 X(const X&); 5 X(X&); 6 };
注意,如果一个类中只有一个参数X&的拷贝构造函数,那么就不能使用const X或volatile X的对象!(volatile类型是什么类型...自己去查)
如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。这个默认的参数可能为X::X(const X&)或X::X(X &)由编译器根据上下文决定选择哪个。
默认拷贝构造函数的行为如下:
默认的拷贝构造函数执行你给的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造。
a>如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数。
b>如果数据成员是一个数组,对数组的每一个执行按位拷贝。
c>如果数据成员是一个数量,如int ,double,那么调用系统内奸的复制运算符对其进行赋值!
3、拷贝构造函数不能由成员函数模板生成。
1 struct X{ 2 template<typename T> 3 X(T&) 4 { 5 cout <<"This is ctor"<<endl; 6 } 7 template<typename T> 8 X& operator=(T& ) 9 { 10 cout <<"This is ctor."<<endl; 11 } 12 13 };
原因很简单,成员函数模板并不改变的规则,而语言的规则说如果程序需要一个拷贝构造函数而你没有声明它,
那么编译器会为你自动生成一个,所以成员函数模板并不会阻止编译器生成拷贝构造函数,赋值运算符重载也遵循同样的规则!