2016-03-24 23 views
-8

在这本书中,我读到这个问题,答案是8次复制ctor在下面被调用了多少次?

  • 怎么样?
  • 请解释一下。 :)

Temp fun1(Temp x) 
{ 
Temp y(x); 
Temp z=y; 
return z; 
} 
void main() 
{ 
Temp a; 
Temp b=fun1(a); 
Temp c=fun1(b); 
} 
+0

这本书没有解释它吗? (这里值得注意的是,这本书是错误的。) –

+1

它可能没有提到RVO(返回值优化)https://en.wikipedia.org/wiki/Return_value_optimization – user3282085

+1

此外,如果书是推荐主要功能返回'无效'它有缺点。 – user3282085

回答

1
#include <iostream> 
class Temp 
{ 
public: 
    int a; 
    Temp() : a(0) {} 
    Temp(const Temp &ref) : a(ref.a) 
    { 
     std::cout << "Temp(Temp&)" << std::endl; 
    } 
}; 

Temp fun1(Temp x) 
{ 
Temp y(x); 
Temp z=y; 
return z; 
} 
int main(int ac, char**av) 
{ 
Temp a; 
Temp b=fun1(a); 
Temp c=fun1(b); 
} 

显示铛6次通话。

786_ g++ -std=c++11 test.cpp 
787_ ./a.out 
Temp(Temp&) 
Temp(Temp&) 
Temp(Temp&) 
Temp(Temp&) 
Temp(Temp&) 
Temp(Temp&) 
+0

谢谢,在书中,他们刚刚给出了答案,没有任何解释。 –