- 博主是基于VS2019测试的,不同编译器可能情况不一样。
- 示例分析
- 只有传值传参
- 传值返回
- 一道例题
博主是基于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次拷贝构造
调用示例如图所示: