Страницы

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

четверг, 2 января 2020 г.

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

#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 ) ) { } Аргументами функции не обязательно должны быть аргументы конструктора. Можно использовать статические члены данных класса, не статически члены данных, которые уже были инициализированы в списке инициализации (лги в объявлении класса должны предшествовать, или объекты, которые находятся в области видимости определения конструктора. Ниже показан пример #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; }

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

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