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

Я наткнулся на странную концепцию под названием «инициализатор члена».

Вот говорит:

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

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

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

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.

16

Другие решения

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

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

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

6

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

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

};
1

От Вот: —

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

0
По вопросам рекламы [email protected]