什么是C ++ 11中的“成员初始化程序”?

时间:2013-09-15 11:17:13

标签: c++ class c++11 member-initialization

我遇到了一个名为“member initializer”的奇怪概念。

Here说:

  

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

它的定义是什么?

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

5 个答案:

答案 0 :(得分:16)

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

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

Bjarne Stroustrup's C++11 FAQ中的更多内容。

答案 1 :(得分:6)

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

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

它避免了必须在构造函数中重复初始化器,对于大型类,它可以是一个真正的胜利。

答案 2 :(得分:1)

C ++ 11允许非静态成员初始化,如下所示:

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

};

答案 3 :(得分:0)

来自here: -

  

非静态数据成员初始化器是一个相当简单的新方法   特征。事实上,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;

答案 4 :(得分:0)

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

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