为啥通过构造函数返回对象时没有临时对象?

Posted

技术标签:

【中文标题】为啥通过构造函数返回对象时没有临时对象?【英文标题】:Why there is no temporary object when returning an object through the constructor?为什么通过构造函数返回对象时没有临时对象? 【发布时间】:2018-03-28 02:41:12 【问题描述】:

我试图弄清楚通过构造函数(转换函数)返回对象时究竟发生了什么。

Stonewt::Stonewt(const Stonewt & obj1) 
    cout << "Copy constructor shows up." << endl;


Stonewt::Stonewt(double lbs) 
    cout << "Construct object in lbs." << endl;


Stonewt::~Stonewt() 
    cout << "Deconstruct object." << endl;


Stonewt operator-(const Stonewt & obj1, const Stonewt & obj2) 
    double pounds_tmp = obj1.pounds - obj2.pounds;
    return Stonewt(pounds_tmp);


int main() 
    Stonewt incognito = 275;
    Stonewt wolfe(285.7);

    incognito = wolfe - incognito;
    cout << incognito << endl;
    return 0;

Output:
Construct object in lbs.
Construct object in lbs.

Construct object in lbs.
Deconstruct object.
10.7 pounds

Deconstruct object.
Deconstruct object.

所以我的问题是:

为什么通过构造函数返回对象时没有拷贝构造函数(没有临时对象)?

【问题讨论】:

你到底在问什么?你只是不明白什么是析构函数吗?您这里的代码太多,无法按原样获得体面的答案。 @RyanHaining 我刚刚重新编辑过。 我想你在找copy elision @RyanHaining 就是这样。谢谢! What are copy elision and return value optimization?的可能重复 【参考方案1】:
Stonewt operator-(const Stonewt & obj1, const Stonewt & obj2)

    ...
    return obj1;

 

   incognito = incognito - wolfe;

您的operator - () 正在返回incognito 的副本,然后您将其分配给incognito。然后将副本销毁。

【讨论】:

我以为临时对象是默认构造函数创建的,所以我添加了“cout @LeoHu,那是因为使用了默认的复制构造函数。实现一个拷贝构造函数,它会被调用。

以上是关于为啥通过构造函数返回对象时没有临时对象?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在通过 const 引用传递临时值时调用复制构造函数?

为啥构造函数只能返回一个对象?

构造函数和原型

c++,类的对象作为形参时一定会调用复制构造函数吗?

C++:调用临时对象的构造函数

为啥我的 Dart 构造函数返回的是动态对象而不是类型对象?