-1

我偶然发现了一个我以前从未想过的问题。这里是:每个对象(在初始化列表中列出)的“构造函数”都会被触发。

class B
{
    public:
        B() { cout<<"B Con\n";}
        B(const B &b) { cout<<"B Copy Con\n";}
};

class A
{
    public:
        A(B &b):_m(b) { cout<<"A Con\n";}
        A(const A &a):_m(a._m) { cout<<"A Copy Con\n";}
    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 的复制构造函数。为什么不是构造函数而是复制构造函数?

4

4 回答 4

1

原因是当你打电话

_m( whatever )

然后是复制构造函数

B(const B &b)

是唯一可以匹配参数列表的。你传给它一个参数,那个参数的类型是class B.

复制构造函数并不是什么特别的东西——它只是一个参数化的构造函数,一旦参数列表匹配,它将通过初始化列表调用。

于 2011-08-23T11:53:03.610 回答
1

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

于 2011-08-23T11:54:12.520 回答
1

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

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

于 2011-08-23T12:04:24.507 回答
0
A(B &b):_m(b) { cout<<"A Con\n";}

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

于 2011-08-23T11:52:58.607 回答