[C++]:关于构造函数中的启动列表的问题

[c++]: problem about initiation list in constructor

本文关键字:启动 列表 问题 构造函数 C++      更新时间:2023-10-16

我偶然发现了一个我以前从未想过的问题。在这里:每个对象的(列在初始化列表中(的">构造函数"将被触发。

class B
{
    public:
        B() { cout<<"B Conn";}
        B(const B &b) { cout<<"B Copy Conn";}
};
class A
{
    public:
        A(B &b):_m(b) { cout<<"A Conn";}
        A(const A &a):_m(a._m) { cout<<"A Copy Conn";}
    private:
        B _m;
}
main()
{
    B b;
    A a(b);
}

然后我得到了如下输出:

B Con
B Copy Con
A Con

根据输出,我认为"A a(b("触发了 B 的复制构造函数。如果我做对了,那么这意味着'A(B &b(:_m(b(' 触发 B 的复制构造函数。为什么不是构造函数而是复制构造函数?

原因是当你打电话的时候

_m( whatever )

然后是复制构造函数

B(const B &b)

是唯一可以匹配参数列表的。您向其传递一个参数,该参数的类型为 class B

复制构造函数并不是超级特别的东西 - 它只是一个参数化的构造函数,一旦参数列表匹配,就会通过初始化列表调用。

因为你告诉编译器用b初始化_m,怎么会不调用复制构造函数呢?

答案在于使用复制构造函数实例化 B _m A(B &b):_m(b)

相反,如果您这样做A(B &b):_m()它将使用默认构造函数。

A(B &b):_m(b) { cout<<"A Conn";}

在这里_m(b)导致调用 B 的复制构造函数B(const B&)。这就是为什么,它在初始化_m时首先打印B Copy Con,然后进入 A 的构造函数主体,并打印A Con。这解释了一切。