★四、临时对象
深入探讨C++中临时对象的常见产生情况及其解决的方案-优快云博客
函数以值传递的方式返回一个对象时,会产生临时对象。以返回的对象作为拷贝构造函数的实参构造一个临时对象。
进行类型转换会产生临时对象. 原因就是类型转换的原理就是把转换前的对象当作形参, 传递给构造函数生成一个临时对象, 类型转换后, 临时对象就调用析构函数进行了销毁.
在函数返回对象时候,会创建一个临时对象接收这个对象; 从而调用了拷贝构造函数,和析构函数。
临时对象会调用拷贝构造函数,赋值运算符,析构函数,造成不必要开销
1、值传递导致临时对象产生
解决:使用引用传递
2、类型转换产生临时对象
#include <iostream>
using namespace std;
class complex
{
public:
~complex() {
cout<<"析构函数"<<endl;
}
complex() {
cout << "无参构造" << endl;
};
complex(double r) : re(r)
{
cout << "有1参构造" << endl;
};
complex(double r, double i) : re(r), im(i)
{
cout << "有2参构造" << endl;
};
private:
double re;
double im;
};
int main()
{
complex c2;
c2 = 3.4;
complex c1(2, 1);
return 0;
}
//结果
无参构造
有1参构造
析构函数
有2参构造
析构函数
析构函数
结果中多了 “有1参构造 析构函数”, 因为在进行
c2 = 3.4;
时,类型转换调用了complex
的有参构造函数生成了一个临时对象, 再临时对象赋值给c2后, 临时对象调用析构函数销毁
解决思路:
只要把单参数构造函数的赋值语句,改为初始化语句就行。即:
complex c2;
c2 = 3.4;
改为
complex c2 = 3.4;
//结果
有1参构造
有2参构造
析构函数
析构函数
函数返回产生临时对象
解决思路:使用return reference
,或者返回临时对象->减少一次拷贝构造和析构