Значения элементов по умолчанию рекомендуется использовать
рекомендуется ли при написании кода C++11 устанавливать значения по умолчанию для членов класса в заголовочном файле класса?
или лучше сделать это в конструкторе класса?
EDIT:
Я имею в виду:
фу.h:
#include <string>
using std::string;
class Foo{
private:
string greet = "hello";
public:
Foo();
};
VS
фу.cpp (конечно с необходимым заголовочным файлом, но без инициализации в классе):
Foo::Foo(){
greet = "hello";
}
какой из лучше и почему?
3 ответа:
если член класса всегда инициализируется с тем же начальным значением, то вы должны сделать инициализатор встроенным, чтобы избежать дублирования. Если начальное значение зависит от конструктора, то поместите его в список инициализаторов конструктора. (И никогда не используйте назначение так, как вы это сделали.)
пример:
class Foo { bool done = false; // always start like this int qty; Bar * p; public: Foo() : qty(0), p(nullptr) { } Foo(int q, Bar * bp) : qty(q), p(bp) { } explicit Foo(char const * s) : qty(std::strlen(s)), p(new Bar(s)) { } // ... };
в этом гипотетическом примере всегда требуется, чтобы начать как
false
, поэтому лучше всего написать инициализатор inline. Другой два члена,qty
иp
, могут быть инициализированы по-разному в каждом из трех различных конструкторов, поэтому они инициализируются внутри списков инициализаторов конструкторов.a curiosum: обратите внимание, что предоставление встроенного инициализатора предотвращает ваш класс оттривиальный конструктор по умолчанию.
Это зависит от того, нужно ли вам оставаться совместимым со старыми компиляторами C++.Когда вы не используете C++11, вы должны инициализировать большинство членов (все нестатические) в конструкторе. Кроме того, многие люди выступают за явную инициализацию каждого члена, даже если это означает явный вызов ctor по умолчанию. Обычно вы должны поместить детали реализации в файл cpp, а не в файл заголовка, поэтому примером будет
Example: //foo.h class Foo{ public: Foo(); private: std::vector<int> vect; }; //foo.cpp Foo::Foo():vect(){ }
В C++11 у вас есть больше вариантов и в члене класса инициализатор станет очень удобным, особенно если у вас есть несколько cors. Вот хорошая ссылка для получения дополнительной информации:http://www.stroustrup.com/C++11FAQ. html#member-init
После Редактирования: в соответствии с вашим кодом вы используете C++11. Насколько мне известно, есть только несколько сведений о хорошей практике в отношении новых возможностей, но IMHO в инициализаторе члена класса очень удобны для концентрации инициализации в одном месте, что снижает сложность и набрав
инициализация в заголовках имеет основные преимущества сохранения кода более локальным и простым для понимания. Это экономит также некоторые набрав.
главным недостатком, на мой взгляд, является необходимость включения большего количества заголовков для получения доступа к конструкторам. Простого прямого объявления недостаточно, поэтому компиляция занимает больше времени.