为什么可以在构造函数中使用成员初始化来满足显式构造函数的参数?

Why is it ok to satisfy an explicit constructor's argument using member initialisation in a constructor?

本文关键字:构造函数 满足 初始化 参数 成员 为什么      更新时间:2023-10-16

很抱歉,我给了你一个难以置信的晦涩的标题。

我一直在阅读Herb Sutter的"更多例外的c++",我遇到了一个"计数指针"的例子,我不会粘贴整个代码,但他使用了一个带有签名的显式构造函数:

explicit countedPointer(P* obj): p(new impl(obj) ) {}

进一步,他声明了一个类,其中有一个计数指针对象作为该类的私有成员,在该类的构造函数中,他将计数指针初始化如下:

flagNth(n):pimpl_(new flagNthImpl(n)) {}

其中,pimpl_是计数器指针对象,即

countedPointer<flagNthImpl>pimpl_;

我尝试在main.cpp中运行这段代码,如果我尝试执行以下操作,我会得到一个错误(显然,因为构造函数是显式的)

int main(int argc, const char * argv[])
{
    countedPointer<int> cp = new int(5);
}

我的问题是,为什么可以在构造函数的成员初始化列表中这样做呢?初始化是否与常规初始化有某种不同,如果有,如何区别?

谢谢!

这将适用于您的main:

countedPointer<int> cp(new int(5));

这是直接初始化,将正常调用构造函数。

但是,你这样做:

countedPointer<int> cp = new int(5);

这是复制初始化,这不能用于显式构造函数。要通过显式构造函数成功地使用复制初始化,您需要:

countedPointer<int> cp = countedPointer<int>(new int(5));
当然,通常最好使用直接初始化(如第一个例子)或直接列表初始化:
countedPointer<int> cp{new int(5)};