1.3拷贝构造调用时机

标题:拷贝构造调用时机

一共有三种情况,我们一个一个讲解。
先设置一个初始类防止大家不知道什么是person

class person
{
	public:
		//person 的无参构造函数 
		person()
		{
			cout<<"person 的无参构造函数的调用"<<endl; 
		}
		//person的有参构造函数 
		person(int a)
		{
			age=a;
			cout<<"person 的有参构造函数的调用"<<endl; 
		}
		//拷贝构造函数:
		 person(const person &p)
		
		{
			age=p.age ;
			cout<<"person 的拷贝构造函数的调用"<<endl; 
		}
		//析构函数 
		~person ()
		{
			cout<<"person 析构函数的调用"<<endl; 
		}
		
		int age;
 } ;

所有的操作都在类上进行。

第一种情况:使用一个已经创建完毕的对象去初始化一个新对象
在这里插入图片描述
就这样使用,上一篇文章我们详细讲了的吧,还有许多细节关于拷贝构造,都在上一篇文章。

第二种情况:值传递的方式给函数参数传值
在这里插入图片描述
是不是调用了拷贝构造函数,为什么会调用?我们可以这样理解:因为我们都知道,参数的传递本质是传进去一份零时得副本传递进去。所以需要调用拷贝构造函数。这里说了是值传递对吧,所以我们在函数里面对他进行操作不会改变主函数里面变量的值。换句话说,就是fun(p)和person p中这两个p虽然一样但不是同一个!

值方式返回局部对象
这是vs的:
在这里插入图片描述
这是devc++的
在这里插入图片描述

如果我们用devc++不会显示拷贝构造,用vs才显示了,但是我们要知道他是会进行这个操作的。
我们来理解理解为什么会出现拷贝构造的调用:第一句话是无参构造吧,我们调用了函数,里面有一个无参构造,所以我们调用了无参构造这一句话对吧。我们都知道,函数的运行在栈区,函数结束后我们会把释放所有创建的东西,那么为什么还会返回一个和p0一样的东西呢?所以,我们在返回的时候将这个p0拷贝到了另外一个地方然后进行返回。这么说并不直观,我们来看看他们的地址就明白了。
在这里插入图片描述
先不看其他的,我们就只看地址,并不一样。再来看两个析构,第一个析构很明显就析构的p0;再析构的是p。
看了这个我们可以引出一个易错点:
易错点:不能返回拷贝构造的引用,也就是return &p0;因为上面我们说了这是一个临时变量会被释放。

如有错误,欢迎大家指出。有问题也欢迎在评论区留言。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值