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

15
我遇到了一个奇怪的概念,叫做“成员初始化器”。 这里说:
C++11添加了成员初始化器,在类作用域中应用于成员的表达式,如果构造函数没有初始化该成员本身。
它的定义是什么?
有一些例子可以说明它的用法吗?

6
请点击那里的"C++11"链接,在搜索框中搜索"成员i",......盈利? - Mat
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


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

使用初始化列表可以避免在构造函数中重复设置初始值,对于大型类来说,这是一个真正的优势。


1

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

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

};

我想知道是否可以在private:中定义int a = 2; int b;,而不是在public:中。 - BlackMamba
@BlackMamba 它已经在私有内部了。只有构造函数是公共的。 - Nemanja Boric
1
抱歉,我犯了一个错误。因为默认的访问标识符是“private”。 - BlackMamba

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


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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接