对于代码:
class B{
public:
int data;
B(){
data = 0;
id = s_i++;
cout<<"construct "<<id <<endl;
}
B(const B &b){
data = b.data;
id = s_i++;
cout<<"copy construct "<<id<<endl;
}
B(int i):data(i){
id = s_i++;
cout<<"parameter construct "<<id<<endl;
}
~B() {
cout<<"destruct"<< " " <<id<<endl;
}
static int s_i;
int id;
};
int B::s_i = 0;
B play(B& b) {
b.data = 2;
return b;
}
B creat() {
B b(3);
return b;
// return B(3);
}
int main()
{
/* B b1(1);
B b = play(b1);
cout<<b.data<<endl;*/
B b = creat();
return 0;
}
按照书上的说法是,先创建局部变量b,然后调用拷贝构造函数将b赋值给临时变量t,函数返回调用b的析构函数, 然后t调用拷贝构造函数赋值给main函数中的b,然后t析构,最后main中的b析构。
但是编译器会进行优化,编译器“偷偷地”在我们写的creat函数中增加一个参数 B&,然后把 b 的地址传进去(注意,这个时候 b 的内存空间已经存在了,但对象还没有被“构造”,也就是构造函数还没有被调用),然后在函数体内部,直接用 b 来代替原来的“临时对象”,在函数体内部就完成 b 的构造
还可以继续优化,
B creat() {
return B(3);
}
这将直接构造main中的对象b
有空要好好研究下 http://www.cnblogs.com/liyiwen/archive/2009/12/02/1615711.html
964

被折叠的 条评论
为什么被折叠?



