2016-11-25 2 views
1

В C++ 11, у нас есть два пути, чтобы инициализировать элементы данных класса/структуры, как показано в следующих примерах:Как правильно инициализировать элементы данных в C++ 11?

struct A 
{ 
    int n = 7; 
}; 

struct B 
{ 
    int n; 

    B() : n(7) {} 
}; 

Вопрос 1:

Какой способ лучше?

Вопрос 2:

Является традиционным способом (последний) не рекомендуется с точки зрения современного-C++ - стиль проверки?

ответ

3

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

Пример

struct A 
{ 
    int n = 7; 

    A() {} // n will be initialized to 7 
    A(int n_): n{n_} {} // Initialize n to something else 
}; 
+0

Я не уверен, является ли n {n_} ошибкой или нет? Можно ли использовать нотацию инициализатора в конструкторе? – holmicz

+1

@ OndřejHolman С C++ 11 это действительно. –

+0

еще одна вещь, при использовании списка Initializer может привести к некоторым накладным расходам, если я прав. Я бы избегал использовать, если вам приходится иметь дело с ограниченными ресурсами. – holmicz

2

Я не уверен, но я думаю, что первый случай возможен только с примитивными типами C++. В большинстве книг, особенно в книге 55 «Способы улучшения кода на C++» Скотта Мейерса, рекомендуется пройти первый путь, поэтому я буду придерживаться этого. :-)

Не забывайте, что порядок оценки и инициализации определяется, как сортируются члены в классах.

Я предпочитаю только второй стиль инициализации.

+0

Эта книга была написана в 2005 году, которая составляет 6 лет до 2011 года, поэтому автор не знает нового метода инициализации. – ymonad

+0

Ну, они сделали новое издание. Я не говорю, это на 100% точнее, но некоторые элементы C++ 11 есть, 14 отсутствует полностью. :-) Несмотря на то, что он старый, многие концепции все еще актуальны. – holmicz

+0

Ой, я этого не знаю. и полностью пропустил ваш ответ. прости меня. – ymonad

0

Ни путь лучше, однако, новая форма инициализации имеет льготу быть похож на другие языки и более-все более понятным. Унифицированная инициализация применяется не только к элементам структуры, но и по всем полям для списков инициализаторов и аргументов конструктора.

Смежные вопросы