博主是基于VS2019测试的,不同编译器可能情况不一样。
看下面这一个类A:
class A { public: A(int a = 0) :_a(a) { cout << "A(int a = 0)" << endl; } A(const A& aa) :_a(aa._a) { cout << "~A(const A& aa)" << endl; } ~A() { cout << "~A()" << endl; } A& operator= (const A& aa) { cout<<" A& operatoor = (const A & aa)" <<endl; if (this != &aa) { _a = aa._a; } return *this; } private: int _a; }; void f1(A aa) {} A f2() { A aa; return aa; }
示例分析
只有传值传参
// 传值传参 A aa1; f1(aa1); cout << endl; //一次构造,一次拷贝构造
直接优化例子:
// 隐式类型,连续构造+拷贝构造->优化为直接构造 f1(1);
// 一个表达式中,连续构造+拷贝构造->优化为一个构造 f1(A(2)); cout << endl;
传值返回
// 传值返回 f2(); // 1次 构造一次 + 1次 拷贝构造 cout << endl;
按道理说是1次构造+2次拷贝构造,但是编译器在遇到这种连续的拷贝构造,会自动优化成1次拷贝构造。
// 一个表达式中,连续拷贝构造->优化为一个拷贝构造 A aa1 = f2(); cout << endl;
// 一个表达式中,连续拷贝构造+赋值重载->无法优化 A aa1; aa1 = f2(); cout << endl;
一道例题
void f1(A aa) {} A f2() { A aa; return aa; } A f(A u) { A v(u); A w = v; return w; } int main() { A x; A y = f(f(x)); }
请问调用了几次构造和拷贝构造?
1次构造和7次拷贝构造
调用示例如图所示: