Страницы

Поиск по вопросам

четверг, 10 января 2019 г.

Синтаксис инициализации const членов класса

Есть класс
class object { public: object(); private: const double mass; };
Инициализация const double mass в конструкторе отрабатывает только так:
object::object(): mass(1) { }
Почему не проходит такой вариант?
object::object() { this->mass = 1; }
И как в таком случае инициализировать const члены класса, которые должны предварительно высчитываться относительно входных параметров конструктора?
Какие варианты в C++ удобны для объявления/инициализации const членов класса?


Ответ

Когда выполняется тело конструктора, то все члены данных объекта уже созданы. Поэтому в этом конструкторе
object::object() { this->mass = 1; }
в предложении
this->mass = 1;
применяется оператор присваивания, который нельзя использовать с константными объектами.
Если вам нужно определить значение константного члена данных на основе некоторых вычислений, то в качестве инициализатора используйте некоторую, например, статическую функцию - член класса.
object::object( some_argument ): mass( some_function( some_argument ) ) { }
Аргументами функции не обязательно должны быть аргументы конструктора. Можно использовать статические члены данных класса, не статически члены данных, которые уже были инициализированы в списке инициализации (лги в объявлении класса должны предшествовать, или объекты, которые находятся в области видимости определения конструктора.
Ниже показан пример
#include
class Object { public: Object( double x ) : x ( 2 * x ), mass( init( this->x ) ) { }
double get_mass() const { return mass; }
private: double x; const double mass; static double init( double x ) { return x < 0 ? -x / 2 : x; } };
int main() { Object obj( 10 );
std::cout << obj.get_mass() << std::endl;
return 0; }

Комментариев нет:

Отправить комментарий