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

瓦尔德瓦尔

很抱歉,这个标题难以置信。

我一直在阅读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);
}

我的问题是,为什么可以在构造函数的成员初始化列表中执行此操作?初始化与常规初始化有什么不同吗?如果有,则如何?

谢谢!

Angew不再为SO感到骄傲

这将为您工作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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

为什么在具有主构造函数的记录中需要显式的“ this”构造函数初始化器?

来自分类Dev

为什么在调用构造函数之前进行显式初始化

来自分类Dev

向量构造函数对:初始化列表与显式构造

来自分类Dev

在构造函数中使用输出参数函数初始化const成员的调用的代码比lambda简单

来自分类Dev

使用构造函数的参数初始化向量成员

来自分类Dev

我在构造函数中使用什么类型来初始化由无名枚举定义的成员变量?

来自分类Dev

为什么final可以在构造函数中初始化?

来自分类Dev

在Dart中的可选参数构造函数中使用构造函数初始化成员

来自分类Dev

具有成员初始化列表的显式副本构造函数中的空值

来自分类Dev

显式初始化没有默认构造函数的成员

来自分类Dev

类组合构造函数d必须显式初始化引用成员

来自分类Dev

错误:构造函数必须显式初始化引用成员

来自分类Dev

如何在定义附近使用显式的长度/值构造函数初始化向量成员变量?

来自分类Dev

显式构造函数和嵌套的初始化列表

来自分类Dev

为什么我的值未由初始化(参数化)构造函数初始化?

来自分类Dev

为什么我不能使用构造函数初始化列表来初始化类内结构?

来自分类Java

为什么要在所有构造函数中显式初始化空白的最终变量?

来自分类Dev

是否可以编写有助于复制初始化的显式构造函数?

来自分类Dev

c ++构造函数成员初始化:传递参数

来自分类Java

枚举*似乎*被多次初始化,构造函数被多次调用。如果我是对的,那为什么呢?

来自分类Dev

在构造函数中初始化变量后进行验证:为什么不这样做呢?

来自分类Java

为什么我们不能调用servlet构造函数而不是init方法来初始化config参数?

来自分类Dev

使用委托构造函数时的成员初始化

来自分类Dev

使用委托构造函数进行成员初始化

来自分类Dev

初始化 const 成员并使用父构造函数

来自分类Dev

用户提供的默认构造函数为什么导致未初始化的成员?

来自分类Dev

为什么基类的成员不保留构造函数中首次初始化的值?

来自分类Dev

为什么成员初始化程序在移动时会调用额外的构造函数调用?

Related 相关文章

  1. 1

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  2. 2

    为什么在具有主构造函数的记录中需要显式的“ this”构造函数初始化器?

  3. 3

    为什么在调用构造函数之前进行显式初始化

  4. 4

    向量构造函数对:初始化列表与显式构造

  5. 5

    在构造函数中使用输出参数函数初始化const成员的调用的代码比lambda简单

  6. 6

    使用构造函数的参数初始化向量成员

  7. 7

    我在构造函数中使用什么类型来初始化由无名枚举定义的成员变量?

  8. 8

    为什么final可以在构造函数中初始化?

  9. 9

    在Dart中的可选参数构造函数中使用构造函数初始化成员

  10. 10

    具有成员初始化列表的显式副本构造函数中的空值

  11. 11

    显式初始化没有默认构造函数的成员

  12. 12

    类组合构造函数d必须显式初始化引用成员

  13. 13

    错误:构造函数必须显式初始化引用成员

  14. 14

    如何在定义附近使用显式的长度/值构造函数初始化向量成员变量?

  15. 15

    显式构造函数和嵌套的初始化列表

  16. 16

    为什么我的值未由初始化(参数化)构造函数初始化?

  17. 17

    为什么我不能使用构造函数初始化列表来初始化类内结构?

  18. 18

    为什么要在所有构造函数中显式初始化空白的最终变量?

  19. 19

    是否可以编写有助于复制初始化的显式构造函数?

  20. 20

    c ++构造函数成员初始化:传递参数

  21. 21

    枚举*似乎*被多次初始化,构造函数被多次调用。如果我是对的,那为什么呢?

  22. 22

    在构造函数中初始化变量后进行验证:为什么不这样做呢?

  23. 23

    为什么我们不能调用servlet构造函数而不是init方法来初始化config参数?

  24. 24

    使用委托构造函数时的成员初始化

  25. 25

    使用委托构造函数进行成员初始化

  26. 26

    初始化 const 成员并使用父构造函数

  27. 27

    用户提供的默认构造函数为什么导致未初始化的成员?

  28. 28

    为什么基类的成员不保留构造函数中首次初始化的值?

  29. 29

    为什么成员初始化程序在移动时会调用额外的构造函数调用?

热门标签

归档