在这种情况下调用什么构造函数

What constructor is called in this case?

本文关键字:构造函数 什么 调用 这种情况下      更新时间:2023-10-16

假设我有一个对象

class A {
    public:
    int bar();
};
A foo() {return A();}
int A::bar() {return 5;}

然后我这样做:

int i = foo().bar();

foo()返回时创建的临时值调用什么构造函数?

代码为:

A foo() {return A();}

foo()被调用时,效果顺序为:

  1. A()使用A的默认构造函数临时创建的
  2. 返回A类型的值对象,使用复制/移动构造函数创建,以步骤1的临时函数作为参数(即,如果存在则移动构造函数,否则复制构造函数)。
  3. 步骤1的临时文件被销毁。

然而,这是一个复制省略上下文,因此编译器可能将所有3个步骤合并为一个,并使用A的默认构造函数创建返回值对象

返回值对象的处理取决于调用代码的操作。可能会有进一步的副本省略。用法:

int i = foo().bar();

没有发生其他事情;在返回值对象上调用bar(),将值赋给i,然后销毁返回值对象

如果使用c++ 11编译,在foo内部,当return A()运行时,它调用默认构造函数。然后当它从foo返回move constructor时被调用。但是如果你用旧版本编译,首先调用默认构造函数,然后调用复制构造函数。

调用默认构造函数。也许试着这样做会更清楚:

#include <iostream>
using namespace std;
class A {
public:
  A() {
    cout << "A's default ctor" << endl;
  }
};
int main() {
  A a;
  return 0;
}