Что такое "инициализатор элемента" в С++ 11?

Я просматриваю странную концепцию с именем "member initializer".

Здесь говорится:

С++ 11 добавлены инициализаторы элементов, выражения, которые будут применяться к членам в классе, если конструктор не инициализировал сам элемент.

Каково его определение?

Есть ли примеры, иллюстрирующие его использование?

Ответ 1

Вероятно, это относится к инициализаторам класса. Это позволяет инициализировать нестатические элементы данных в точке объявления:

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

Подробнее об этом в Bjarne Stroustrup С++ 11 FAQ.

Ответ 2

Теперь вы можете добавлять инициализаторы в классе, которые совместно используются для конструкторов:

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

Это позволяет избежать повторения инициализаторов в конструкторе, который для больших классов может быть реальным выигрышем.

Ответ 3

С++ 11 допускает инициализацию нестатического члена следующим образом:

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

};

Ответ 4

Из здесь: -

Инициализаторы нестатических данных являются довольно просто новыми особенность. Фактически GCC Bugzilla показывает, что начинающие пользователи С++ часто пытались использовать его в С++ 98, когда синтаксис был незаконным! Надо сказать, что эта же функция также доступна на Java, поэтому добавление ее в С++ делает жизнь проще для людей, использующих оба языка.

 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;

Ответ 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, если список инициализаторов членов не дает другого значения. Обратите внимание, что инициализаторы элементов не ограничены встроенными типами. Вы также можете использовать единый синтаксис инициализации в списке инициализаторов членов.