很抱歉,这个标题难以置信。
我一直在阅读Herb Sutter的“ More Exceptional C ++”,并且遇到了“计数指针”的示例,我不会粘贴整个代码,但是他使用带有签名的显式构造函数:
explicit countedPointer(P* obj): p(new impl(obj) ) {}
此外,他声明一个具有计数的Pointer对象的类作为该类的私有成员,在该类的构造函数中,他将其计数的指针初始化为:
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)};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句