看这个代码
int cnt = 1; class A { public: A() { i = cnt++; cout << "constructor A " << i << endl; } A(A&a) { i = cnt++; cout << "constructtor A " <<i << endl; } ~A() { cout << "deconstructor A " << i << endl; } int i; }; A h(A a) { return a; //mark 3 } void g() { A a; // mark 1 h(a); // mark 2 } int main() { g(); return 0; }
通过这些代码,和调试工具,f10 f11来查看到底干了啥。
mark1:
构造函数。不用解释。 生成了a1
mark2:
发生了一次构造函数。h(a)会先拷贝构造一个临时变量,作为形参。 然后才进入h函数内部。生成的是a2
mark3:
return这一句发生了两件事,
先发生了一次拷贝构造,就是生成了a3.
然后发生了一次析构,a2被析构了。
mark2:
h函数执行完毕后,a3会被析构。 h(a)生成的a3是一个临时变量。这一行结束就被析构?
g执行完毕,a1会被析构。
所以顺序不是预想的那样。
编译器会自动把上面优化成下面