C++ 函数返回值为对象时调用复制构造函数的问题

C++ 函数返回值为对象时调用复制构造函数的问题

知识点:

C++中调用复制构造函数的三种情况:

  1. 通过一个对象构造另一个对象
  2. 调用参数为对象的函数
  3. 调用返回值为对象的函数

– 上述知识点在各种书籍、博客都无不同,属于C++的标准
– 但是实际测试的时候,当调用返回值为对象的函数时,并未按预想地调用复制构造函数。
– 在查阅了很多博客资料后,原因如下:

  • 当调用返回值为对象的函数时,系统消耗调用复制构造函数、调用构造函数、调用析构函数的代价,为了减少消耗,编译器使用了一项名为返回值优化的技术,使得调用函数时不需要调用复制构造函数

  • 具体过程如下:

class Person{
	string name;
	int age;
	Person(string name,int age){
		this->name = age;
		this->age = age;
	}
	//复制构造函数
	Person(const Person& p){
		cout<<"调用复制构造函数";
	}
};

//返回一个Person对象
Person create(string name,int age){
	return new Person(name,age);
} 
int main(){
	Person p = create("张三",20);
}

优化前:调用create函数时,先根据传入的参数生成一个临时对象 t1(栈中),然后拷贝生成临时对象 t2(栈外),函数执行完毕,返回 t2的地址,t1被回收;p根据返回的 t2 地址构造对象

优化后:调用create函数时,编译器偷偷地增加了一个参数,传入了p的地址,直接在函数内部构造了p对象

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值