#cpp #классы #конструктор
Есть класс class object { public: object(); private: const double mass; }; Инициализация const double mass в конструкторе отрабатывает только так: object::object(): mass(1) { } Почему не проходит такой вариант? object::object() { this->mass = 1; } И как в таком случае инициализировать const члены класса, которые должны предварительно высчитываться относительно входных параметров конструктора? Какие варианты в C++ удобны для объявления/инициализации const членов класса?
Ответы
Ответ 1
Когда выполняется тело конструктора, то все члены данных объекта уже созданы. Поэтому в этом конструкторе object::object() { this->mass = 1; } в предложении this->mass = 1; применяется оператор присваивания, который нельзя использовать с константными объектами. Если вам нужно определить значение константного члена данных на основе некоторых вычислений, то в качестве инициализатора используйте некоторую, например, статическую функцию - член класса. object::object( some_argument ): mass( some_function( some_argument ) ) { } Аргументами функции не обязательно должны быть аргументы конструктора. Можно использовать статические члены данных класса, не статически члены данных, которые уже были инициализированы в списке инициализации (лги в объявлении класса должны предшествовать, или объекты, которые находятся в области видимости определения конструктора. Ниже показан пример #includeclass 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; }
Комментариев нет:
Отправить комментарий