复制构造函数唯一吗

复制构造函数唯一吗?查了许多类似的帖子,没有找到明确的回答。拿我来看,我认为不一定唯一。
下面我将用简单的对比来说明我认为的不唯一。
插入一段代码

#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的复制构造函数将被调用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值