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