【C++】拷贝构造函数于临时变量小探

【C++】拷贝构造函数于临时变量小探

今天遇到了一个关于拷贝构造于临时变量的小问题,在这里记录一下。

这是代码:

#include <iostream>

using namespace std;

class s1mple {
public:
    int i;
    s1mple() : i(23) {
        cout << "constructor" << endl;
    }

    s1mple(const s1mple& x) {
        cout << "copy constructor" << endl;
        i = x.i;
    }

    ~s1mple() {
        cout << "deconstruct" << endl;
    }
};

s1mple func() {
    s1mple s1;
    s1.i = -23;
    return s1;
}

int main() {
    s1mple xt = func();
    return 0;
}

程序输出

constructor
copy constructor
deconstruct
deconstruct

如果修改程序如下:

#include <iostream>

using namespace std;

class s1mple {
public:
    int i;
    s1mple() : i(23) {
        cout << "constructor" << endl;
    }

    s1mple(const s1mple& x) {
        cout << "copy constructor" << endl;
        i = x.i;
    }

    ~s1mple() {
        cout << "deconstruct" << endl;
    }
};

s1mple func() {
    s1mple s1;
    s1.i = -23;
    return s1;
}

int main() {
    func();
    return 0;
}

输出仍然不变

constructor
copy constructor
deconstruct
deconstruct

通过对内存地址的比对发现,在第一种情况下,返回值直接作为xt的拷贝构造函数的引用值参与拷贝构造,而在第二种情况下,返回值是作为构造临时变量的拷贝构造函数的参数参与拷贝构造。

另外注意,我的生成环境是 visual studio 2019debug 模式,在 release 模式下拷贝构造并没有被触发(?)

参考资料

  1. 通过参数-fno-elide-constructors关闭g++的编译优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值