views:

114

answers:

3

i have this code

#include <iostream>
using namespace std;

class Test{
public:
 int a;
 Test(int i=0):a(i){}
 ~Test(){
  cout << a << endl;
 }
 Test(const Test &){
  cout << "copy" << endl;
 }
 void operator=(const Test &){
  cout << "=" << endl;
 }
 Test operator+(Test& p){
  Test res(a+p.a);
  return res;
 }
};

int main (int argc, char const *argv[]){
 Test t1(10), t2(20);
 Test t3=t1+t2;
 return 0;
}

Output:

30
20
10

Why isnt the copy constructor called here?

+2  A: 

I assume you're wondering about the line Test t3=t1+t2;

The compiler is allowed to optimize the copy construction away. See http://www.gotw.ca/gotw/001.htm.

mkj
+7  A: 

This is a special case called Return Value Optimization in which the compiler is allowed to optimize away temporaries.

wilhelmtell
+2  A: 

As the others said, its just optimizing the call to the copy constructor, here what happens if you disable those optimizations.

barricada ~$ g++ -o test test.cpp -O0 -fno-elide-constructors
barricada ~$ ./test
copy
30
copy
134515065
-1217015820
20
10
Arkaitz Jimenez