临时对象的构造/析构

★四、临时对象

深入探讨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 ,或者返回临时对象->减少一次拷贝构造和析构
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值