Значения элементов по умолчанию рекомендуется использовать


рекомендуется ли при написании кода C++11 устанавливать значения по умолчанию для членов класса в заголовочном файле класса?

или лучше сделать это в конструкторе класса?

EDIT:

Я имею в виду:

фу.h:

#include <string>

using std::string;

class Foo{
    private:
        string greet = "hello";
    public:
        Foo();
};

VS

фу.cpp (конечно с необходимым заголовочным файлом, но без инициализации в классе):

Foo::Foo(){
    greet = "hello";
}

какой из лучше и почему?

3 52

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 в инициализаторе члена класса очень удобны для концентрации инициализации в одном месте, что снижает сложность и набрав

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

главным недостатком, на мой взгляд, является необходимость включения большего количества заголовков для получения доступа к конструкторам. Простого прямого объявления недостаточно, поэтому компиляция занимает больше времени.