有关对象作为函数返回值时复制构造与析构被调用的问题

本文分析了C++中函数返回临时对象时,复制构造函数和析构函数的调用情况。讨论了两段代码中复制函数被调用次数的差异,并解释了为何在更改返回值后少了一次调用。同时,针对类的复制构造函数与析构函数在不同场景下的行为进行了深入解析。
摘要由CSDN通过智能技术生成

情况1:

#include <bits/stdc++.h>
using namespace std;
class stu{
	private:
		int num; 
	public:
		stu(int a):num(a){} 
		stu(const stu& a){
			cout<<"复制函数被调用"<<endl; 
		} 
		~stu(){
			cout<<"析构被调用"<<endl;
		}
};
stu fun(stu x){
	stu b(1);
	return x; 
}
int main(){
	stu a1(1);
	fun(a1);
	return 0;
}
/*输出:
复制函数被调用
复制函数被调用
析构被调用
析构被调用
析构被调用
析构被调用

上面fun()中:  a1通过复制函数初始化形参x; return x;返回给一个临时对象调用复制;

形参消亡前调用析构; 局部变量b消亡调用析构; 临时对象消亡调用析构; main()a1消亡调用析构;

没毛病.但是以下:

#include <bits/stdc++.h>
using namespace std;
class stu{
	private:
		int num; 
	public:
		stu(int a):num(a){} 
		stu(const stu& a){
			cout<<"复制函数被调用"<<endl; 
		} 
		~stu(){
			cout<<"析构被调用"<<endl;
		}
};
stu fun(stu x){
	stu b(1);
	return b; 仅仅改变了返回值///
}
int main(){
	stu a1(1);
	fun(a1);
	return 0;
}
/*输出:
复制函数被调用
析构被调用
析构被调用
析构被调用

却少了一次调用复制和析构. 

情况2同上:

#include <bits/stdc++.h>
using namespace std;
class stu{
	private:
		int num;
	public:
		stu(int a):num(a){}
		stu(const stu& a1){
			num=a1.num;
			cout<<"复构被调用"<<endl;
		}
		~stu(){
			cout<<"析构函数被调用"<<endl;
		}
};
stu fun(){
	stu b1(1);
	return b1;
};
int main(){
	stu a1(1);
	fun();
return 0;
}
/*输出:
析构函数被调用
析构函数被调用

 按 "函数作为返回值时 在调用该函数时会调用复制构造函数对返回值(临时)对象进行初始化" 来说,假设令fun()函数会返回临时对象c,c通过调用类的复制构造函数进行初始化,即b1为该函数实参传递给c,此时应该输出"复构被调用",(但是没有),并且该函数结束调用应调用析构函数对临时对象c进行处理,输出"析构函数被调用".fun()函数内有b1局部变量,b1在函数结束后也该调用析构函数进行处理并输出"析构函数被调用",最后main()中的a1也该输出,三个但是输出了两个?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值