C++ Инициализировать переменную-член класса const в заголовочном файле или в конструкторе?

Я просто хотел спросить, как лучше всего инициализировать переменные-члены класса const в C++, в заголовочном файле или в конструкторе?

Спасибо : )

В заголовочном файле:

.h файл:

class ExampleClass{

public:
ExampleClass();

private:
const std::string& string_member_variable_ = "Sample Text";
}

or

В конструкторе:

.h файл:

class ExampleClass{

public:
ExampleClass();

private:
const std::string& string_member_variable_;
}

.cpp-файл:

ExampleClass::ExampleClass() : string_member_variable_("Sample Text") {}

person JilReg    schedule 17.07.2017    source источник


Ответы (3)


Они оба не совсем одинаковы, с инициализацией конструктора один недостаток заключается в том, что вам нужно поддерживать порядок инициализации. Также, если вы используете .cpp и .h, вам может потребоваться всегда переключаться на cpp, чтобы найти инициализированные значения.

На этот вопрос уже дан ответ в этом вопросе -класс инициализатор?

person Randolf    schedule 17.07.2017

Аргументы за "в конструкторе":

  • Согласованность стиля кода со старой кодовой базой.
  • Необходимость сборки кода на разных платформах с разными компиляторами.
  • Возможное сокращение времени компиляции при разработке. Если вы измените значение своей константы, все блоки, включающие ваш заголовок, будут перестроены.
person Eugene    schedule 17.07.2017

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

class MyClass{
public:
    const std::string myconst = "Hello World";  // in-place initialization C++11
};

class MyClass{
public:
    const std::string myconst;
    MyClass() : myconst("Hello World"){}    // initialize const member in a constructor
};

Когда дело доходит до нестатических интегральных констант, я бы выбрал вариант конструктора. Объявите константу в заголовочном файле и инициализируйте ее внутри конструктора в исходном файле. Другое дело, что эта часть:

const std::string& string_member_variable_ = "Sample Text";

неверно, и ваш компилятор предупредит вас, что:

ссылочный элемент инициализируется временным, который не сохраняется после выхода из конструктора

Вместо этого используйте const std::string.

person Ron    schedule 17.07.2017
comment
Привет, Рон, спасибо за быстрый ответ. Я знаю, что оба варианта возможны, поэтому я спросил, что лучше? :) - person JilReg; 17.07.2017