【问题标题】:Why C++ forces initialization of member variables to be in the order of the declaration为什么 C++ 强制成员变量的初始化按照声明的顺序进行
【发布时间】:2021-09-12 06:18:22
【问题描述】:

我知道在 C++ 中,类头中的成员声明定义了初始化顺序。你能告诉我为什么 C++ 选择这个设计吗?强制初始化顺序而不是遵循初始化列表有什么好处?

【问题讨论】:

    标签: c# c++ initialization initialization-order


    【解决方案1】:

    构造函数可以重载,而析构函数不能。如果数据成员可以针对不同的构造函数以不同的顺序进行初始化,那么析构函数就不能保证以数据成员的构造相反的顺序对数据成员执行销毁(对于由不同构造函数构造的对象)。

    【讨论】:

    • ...如果您必须拥有这种控制,有办法从这些机制中删除成员的初始化和销毁​​,并自行完成,但这有(通常)运行时开销和概念开销。
    • @HTNW 同意概念开销,但为什么是运行时?如果你有一个成员存储缓冲区,然后在构造函数中使用placement new,这相对于传统成员变量会有什么开销?
    • @DanielLangr 我说的是“一般”,但并非总是如此,但如果您最终这样做,我确实发现您可能需要存储一些额外的数据以进行簿记。例如。如果您想以相反的构造顺序复制默认破坏,但构造顺序以某种方式发生变化,那么您必须存储您在构造时执行它的顺序,然后在破坏时分支。或者,如果您有时可能没有构建成员,那么您必须在销毁时记住这一点(例如 std::optional/std::variant)。
    猜你喜欢
    • 2021-07-19
    • 2014-08-08
    • 2023-03-24
    • 1970-01-01
    • 2019-05-25
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多