C++11 中的"member initializer"是什么?

What is "member initializer" in C++11?

本文关键字:是什么 initializer member 中的 C++11      更新时间:2023-10-16

我遇到了一个名为"成员初始值设定项"的奇怪概念。

这里说:

C++11 添加了成员初始值设定项、要应用于成员的表达式 在类范围内,如果构造函数未初始化成员本身。

它的定义是什么?

有一些例子来说明它的用法吗?

它可能是指类内成员初始值设定项。这允许您在声明点初始化非静态数据成员:

struct Foo
{
  explicit Foo(int i) : i(i) {} // x is initialized to 3.1416
  int i = 42;
  double x = 3.1416;
};

更多关于这一点的信息,请参阅Bjarne Stroustrup的C++11常见问题解答。

现在可以在类中添加为构造函数共享的初始值设定项:

class A
{
   int i = 42;
   int j = 1764;
public:
   A() {} // i will be 42, j will be 1764
   A( int i ) : i(i) {} // j will be 1764
};

它避免了在构造函数中重复初始值设定项,这对于大型类来说可能是真正的胜利。

C++11 允许像这样进行非静态成员初始化:

class C
{
   int a = 2; /* This was not possible in pre-C++11 */
   int b;
public:
   C(): b(5){}
};

成员初始值设定项是指可以在类定义中设置的初始值设定项的扩展。例如,您可以使用

struct foo
{
     std::string bar = "hello";
     std::string baz{"world"};
     foo() {}                              // sets bar to "hello" and baz to "world"
     foo(std::string const& b): bar(b) {}  // sets bar to b and baz to "world"
};

如果成员初始值设定项列表未提供其他值,则bar初始化为 hello。请注意,成员初始值设定项不限于内置类型。还可以在成员初始值设定项列表中使用统一初始化语法。

从这里开始:-

非静态数据成员初始值设定项是一个相当简单的新 特征。事实上,GCC Bugzilla揭示了用户经常尝试的新手C++ 在 C++98 中使用它,当时语法是非法的!不得不说, 同样的功能在 Java 中也可用,因此将其添加到 C++ 中会 使用两种语言的人的生活更轻松。

 struct A
  {
    int m;
    A() : m(7) { }
  };
  struct B
  {
    int m = 7;   // non-static data member initializer
  };
thus the code:
  A a;
  B b;
  std::cout << a.m << 'n';
  std::cout << b.m << std::endl;