对象优化及右值引用优化(二)
函数调用举例
class Test {
public:Test(int val = 0) :val_(val) {cout << "Test::Test" << endl;}~Test(){cout << "Test::~Test" << endl;}Test(const Test& test){cout << "Test::Test(const Test& test)" << endl;val_ = test.val_;}Test& operator=(const Test& test){if (this == &test)return *this;cout << "Test::operator=(const Test& test)" << endl;val_ = test.val_;return *this;}int getData() const{ return val_; }
private:int val_;
};Test getObject(Test t)
{int val = t.getData();Test tmpTest = Test(val);return tmpTest;
}int main()
{Test t1(10);Test t2;t2 = getObject(t1);
}
- t1构造函数的调用
- t2构造函数的调用
- 调用getObject的时候实参t1为形参赋值,调用拷贝构造函数
- 进入getObject函数,在其栈帧对tmpTest对象进行构造,调用构造函数
- 返回tmpTest的时候,会在main栈帧创建临时变量,调用拷贝构造函数
- 出了getObject的栈帧的时候会对tmpTest调用析构函数
- 对getObject的对象t进行析构
- 临时对象对t2进行赋值,调用赋值函数
- 执行到下一语句,临时对象析构
- t2析构
- t1析构
注:不同编译器其执行顺序略有不同