gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:20 26 4
gpt4 key购买 nike

我很抱歉这个令人难以置信的神秘标题。

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

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

进一步,他声明了一个类,这个类有一个计数指针对象作为类的私有(private)成员,在这个类的构造函数中,他这样初始化他的计数指针:

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)};

关于c++ - 为什么可以在构造函数中使用成员初始化来满足显式构造函数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com