【问题标题】:C++ instance variable default initialization [duplicate]C ++实例变量默认初始化[重复]
【发布时间】:2020-09-28 13:43:06
【问题描述】:

如果我想为实例变量分配默认值,应该首选哪种方法? 有区别吗?

Class Foo {
    int x = 0;
};

Class Foo {
    int x;
    Foo() : x(0) {}
};

【问题讨论】:

  • 两种形式都无效。您应该使用 class 和小 c 而不是 Class
  • 总体上有所不同,正如答案中所回答的那样,这是一个副本。在这种情况下,您使用的是int,所以这实际上并不重要。但一般来说,您可以写int x{0} 使两者等效。至于从代码风格的角度来看哪个更好是一个离题的问题。但大多数人似乎都同意内联初始化是首选,特别是因为如果被调用的 ctor 使用该成员的初始化程序,则会跳过初始化。所以它实际上没有任何开销(没有“双重初始化”。)

标签: c++ class initialization


【解决方案1】:

您可以选择在构造函数中使用指定的成员初始化器以及成员初始化器列表为成员变量设置初始化策略。如果给定的构造函数没有初始化给定的非静态数据成员,则该数据成员的初始化将回退到指定的成员初始化程序(如果存在)。

#include <iostream>

template<std::size_t TAG_N> struct Tag{};

struct Foo {
    int x{42};
      // ^^^^ - designated member initializer (DMI) 
    
    Foo() {}               // Use DMI -> x is 42
    Foo(Tag<0>) {}         // Use DMI -> x is 42
    Foo(Tag<1>) : x(1) {}  // Initialized in mem. init list -> x is 1.
};


int main() {
    std::cout << Foo{}.x << " "
        << Foo(Tag<0>{}).x << " "
        << Foo(Tag<1>{}).x << "\n";
    // 42 42 1
}

选择哪种方法会进入基于意见的领域,但偏爱一致性绝不是一个坏建议,而且[意见]许多行业专家建议在提供多个构造函数的类中使用设计的成员初始化器,以避免陷入例如向类添加一个新成员,但忘记在重载构造函数的成员初始化器列表中对其进行初始化。

【讨论】:

    猜你喜欢
    • 2016-06-17
    • 2017-12-30
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多