复制构造函数唯一吗?查了许多类似的帖子,没有找到明确的回答。拿我来看,我认为不一定唯一。
下面我将用简单的对比来说明我认为的不唯一。
插入一段代码
#include <iostream>
using namespace std;
class Sample {
public:
int v;
Sample(int m){//类型转换构造函数
v = m;
}
Sample(const Sample& s){//复制构造函数,暂时认为唯一的 ----可能不唯一
v = s.v + 2;
}
Sample(){
}
};
void PrintAndDouble(Sample o)
{
cout << o.v;
cout << endl;
}
int main()
{
Sample a(5);
Sample b = a; //初始化阶段的 赋值语句,调用复制构造函数
PrintAndDouble(b);// 参数是 Sample的对象,调用时Sample的 复制构造函数将被调用
Sample c = 20;
PrintAndDouble(c);// 参数是 Sample的对象,调用时Sample的 复制构造函数将被调用
//here
Sample d = a; //初始化阶段的 赋值语句,调用复制构造函数
cout << d.v;
return 0;
}
这里还是可以理解的,最后一行输出为7,因为a.v = 5,Sample d = a时调用了自定义的赋值构造函数,a作为形参a.v + 2 赋值给了d.v,最后一行输出7,输出结果为
将here那里改一下
将Sample d = a; 改成两行Sample d; d = a;
编译运行后的结果是
运行后最后一行输出了5,为什么 一次定义赋值 变成 先定义再赋值 结果会不一样?这是因为系统默认的赋值构造函数还在,当d一次定义赋值时,因为相当于d第一次出现,所以会调用自定义的赋值构造函数;而先定义再赋值时,d已经定义了,只是复制,不调用自定义的复制构造函数 ,或者说调用了默认的复制构造函数。
这也就说明了为什么两次结果不一样,也就说明默认构造函数一直存在,所以说复制构造函数不一定唯一。
ps:以上纯属个人理解,欢迎大家指正!
那复制构造函数在哪些情况下起作用呢?(参考其他人和自己的理解)
- 当用一个对象去初始化同类的另一个对象(在有自定义的复制构造函数时,定义和初始化一起时会调用自定义的复制构造,否则调用默认的复制构造函数)。
- 如果某函数有一个参数是类A的对象,那么该函数被调用时,类A的复制构造函数将被调用。
- 如果函数的返回值时类A的对象时,则函数返回时,A的复制构造函数将被调用。