为什么可以在构造函数中使用成员初始化来满足显式构造函数的参数?
Why is it ok to satisfy an explicit constructor's argument using member initialisation in a constructor?
很抱歉,我给了你一个难以置信的晦涩的标题。
我一直在阅读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)};
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 只有在结构实例的构造函数中满足条件时,才能创建该实例
- 为什么可以在构造函数中使用成员初始化来满足显式构造函数的参数?
- 视觉C++无法正确满足构造函数要求