在传参和传值返回的过程中,编译器会通过一些优化减少拷贝的次数。
class A
{
public:A():_a(1){cout << "A()" << endl;}A(const A& aa):_a(aa._a){cout << "A(const A& aa)" << endl;}A& operator=(const A& aa){cout << "A& operator=(const A& aa)" << endl;if (this != &aa){_a = aa._a;}return *this;}~A(){cout << "~A()" << endl;}private:int _a;
};void f1(A aa)
{
}A f2()
{A a1;return a1;
}
场景1:
int main()
{// 传值传参A a1;f1(a1);cout << endl;// 传值返回f2();cout << endl;return 0;
}
运行结果:
1. 隐式转换,连续构造+拷贝构造——>直接构造:
int main()
{f1(1);return 0;
}
2. 一个表达式中,连续构造+拷贝构造——>直接构造:
int main()
{f1(A(1));return 0;
}
3. 一个表达式中,拷贝构造+拷贝构造——>一个拷贝构造:
int main()
{A a2 = f2();return 0;
}