c++使用返回的对象初始化对象

c++ using returned object to initialize an object

本文关键字:对象 初始化 返回 c++      更新时间:2023-10-16

我对C++的返回值机制感到困惑,我写了以下代码来证明我的操作,代码的结果(后面有"?",输出为粗体)让我感到困惑,有人能解释为什么它会这样输出吗,或者仅仅是因为我的编译器供应商(MS Visual C++)为我优化了吗?

#include <iostream>
class WInt
{
public:
    WInt( int a ) : a(a){ std::cout << a << " " << "A constructor" << std::endl; }
    WInt( const WInt& a )
    { 
        std::cout << "copy constructor run" << std::endl;
        this->a = a.a;
    }
    ~WInt(){ std::cout << "WInt destructor" << std::endl; }
    WInt& operator=( const WInt& v )
    {
        std::cout << "assignment operator" << std::endl;
        this->a = v.a;
        return *this;
    }
    friend const WInt operator+( const WInt& v1, const WInt& v2 )
    {
        return WInt( v1.a + v2.a );
    }
private:
    int a;
};
int main( int argc, char* argv[] )
{
    std::cout << "-----------" << std::endl;
    WInt a(1); // run constructor
    WInt b(2); // run constructor
    std::cout << "-----------" << std::endl;
    WInt c = a + b; // ???????????????????
    std::cout << "-----------" << std::endl;
    WInt d( a + b ); // ???????????????????
    std::cout << "-----------" << std::endl;
    c = a + b + c; // run the +, +, =, ~, ~
    std::cout << "-----------" << std::endl;
    WInt e = c; // run copy constructor
    std::cout << "-----------" << std::endl;
    return 0;
}

输出为:

-----------
1 A constructor
2 A constructor
-----------
**3 A constructor**
-----------
**3 A constructor**
-----------
3 A constructor
6 A constructor
assignment operator
WInt destructor
WInt destructor
-----------
copy constructor run
-----------
WInt destructor
WInt destructor
WInt destructor
WInt destructor
WInt destructor

这是返回值优化。您的编译器正在优化不必要的副本(尽可能优化)。

编辑:检查此问题以获得进一步解释。