编译如何选择要调用的构造函数?

1 c++ constructor class copy-constructor default-copy-constructor

这是我的代码。

当我删除第11行时,输出为

A(0)
B(0)
A(1)
Run Code Online (Sandbox Code Playgroud)

关于最后一行“ A(1)”,为什么要调用类A的第二个构造函数?

#include <iostream>

using namespace std;

class A {
public:
   A() { cout << "A(0)" << endl; }
   A(const A& a) { cout << "A(1)" << endl; }
};

class B {
public:
    B() : a() { cout << "B(0)" << endl; }
    // B(const B& b) { cout << "B(1)" << endl; }
private:
    A a;
};

int main() {
   B object1;
   B object2 = object1;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)
A(0)
B(0)
A(1)
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 7

什么时候

B(const B& b) { cout << "B(1)" << endl; }
Run Code Online (Sandbox Code Playgroud)

被注释/删除后,编译器会为您生成一个副本构造函数。提供的复制构造函数将复制该类的所有成员,因此在这种情况下,它将标记出一个看起来像

B(const B& copy) : a(copy.a) {}
Run Code Online (Sandbox Code Playgroud)

这就是为什么您看到a的副本构造函数被调用的原因。

不注释/删除时

B(const B& b) { cout << "B(1)" << endl; }
Run Code Online (Sandbox Code Playgroud)

您不进行复制a是因为您不要求这样做。编译器所做的是通过将构造函数转换为为其创建默认初始化

B(const B& b) : a() { cout << "B(1)" << endl; }
Run Code Online (Sandbox Code Playgroud)

因此将调用默认构造函数而不是复制构造函数。