Very good insight; it makes sense to me.
Thanks very much.
On 2007-12-26 20:49:58 -0500, eastern_strider
<oguzak...@gmail.com> said:
Hi,
In the following code snippet, if I comment out line b, the output
becomes:
constructor
constructor
whereas if I comment out line c, the output becomes:
constructor
copy constructor
Any explanations regarding what is causing this difference is
appreciated.
#include <iostream>
using namespace std;
class A {
public:
A() { cout << "constructor" << endl; }
A(const A& obj) { cout << "copy constructor" << endl; }
A foo() { return A(); }
};
int main()
{
A a;
A b(a); // <--- line b
A c(a.foo()); // <--- line c
return 0;
}
Interesting find on this C++ behavior.
I'm guessing it's a compiler optimization.
In line b, you're declaring another object that is different from
a. So, the compiler had to invoke the copy constructor to create
another object (b).
However, in line c, the call a.foo() returns a temporary object,
call it t. This object t is already another object that is different
from a. So, the compiler most likely just aliased the variable c to t,
to avoid an unnecessary object copying.
The scope of t is now the body of main and not line c anymore. That is,
it won't be cleaned up at the end of line c, but instead, it
will be cleaned up at the end of main.
--
-kira