Я наткнулся на странную концепцию под названием «инициализатор члена».
Вот говорит:
C ++ 11 добавил инициализаторы членов, выражения, которые будут применены к членам
на уровне класса, если конструктор не инициализировал сам член.
Каково его определение?
Есть ли примеры, иллюстрирующие его использование?
Это, вероятно, относится к инициализаторам членов класса. Это позволяет вам инициализировать нестатические элементы данных в точке объявления:
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.
Теперь вы можете добавить инициализаторы в класс, которые являются общими для конструкторов:
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
};
Это избавляет от необходимости повторять инициализаторы в конструкторе, что для больших классов может быть настоящей победой.
C ++ 11 допускает нестатическую инициализацию члена следующим образом:
class C
{
int a = 2; /* This was not possible in pre-C++11 */
int b;
public:
C(): b(5){}
};
От Вот: —
Нестатические Инициализаторы Участника Данных являются довольно прямым новым
особенность. На самом деле 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;
Инициализаторы членов относятся к расширению того, что инициализаторы могут быть установлены в определении класса. Например, вы можете использовать
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
если список инициализатора члена не дает другого значения. Обратите внимание, что инициализаторы членов не ограничены встроенными типами. Вы также можете использовать единый синтаксис инициализации в списке инициализаторов членов.