14

我遇到了一个名为“成员初始化器”的奇怪概念。

这里说:

C++11 添加了成员​​初始化器,如果构造函数没有初始化成员本身,则表达式将应用于类范围内的成员。

它的定义是什么?

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

4

5 回答 5

18

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

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 FAQ 的内容。

于 2013-09-15T11:19:06.307 回答
7

您现在可以在类中添加构造函数共享的初始化程序:

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
};

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

于 2013-09-15T11:20:18.490 回答
1

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

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请注意,成员初始化器不限于内置类型。您还可以在成员初始化器列表中使用统一初始化语法。

于 2013-09-15T11:22:28.830 回答
1

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

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

};
于 2013-09-15T11:19:40.530 回答
0

这里:-

非静态数据成员初始化器是一个相当简单的新特性。事实上,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;
于 2013-09-15T11:22:16.217 回答