2013-07-13 83 views
1

我对C++的返回值机制感到困惑,并且我编写了以下代码来证明我的opion和代码的结果(在它后面有“?”,输出是大胆)混淆了我,任何人都可以解释为什么它输出,或者只是因为我的编译器供应商(MS Visual C++)为我优化?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 
+1

我觉得下面的链接将是有益的: “http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization” –

回答

1

这是return value optimization。您的编译器正在优化不必要的副本(尽可能最佳)。

编辑:检查this问题的进一步解释。

+0

这正是我想要的,谢谢! – JavaBeta