В чем заключается семантика константного метода?

Рассмотрим следующий код:

class Aggregation
{
    public:
    Object* get() const
    {
        return object;
    }

    private:
    Object* object;
};

Метод get() предоставляет доступ к объекту, на который (возможно) указывает object.

Я не могу понять, в каком случае нужно считать метод get() константным, а в каком нет? Есть ли для этого устоявшийся набор правил?

Например, в данном случае метод не меняет состояние указателя object, и компилятор считает, что метод не изменяет состояние объекта класса Aggregation.

Но я могу объявить метод неконстантным, сказав: изменение подобъекта через указатель object меняет состояние объекта класса Aggregation.

И, формально, я буду прав?


Ответы (3 шт):

Автор решения: AlexGlebe

Метод нужно объявлять константным если он может быть вызван для константных объектов. Этот метод не имеет право менять значения собственных переменных. Все другие функции без const декларации допускаться не будут.

На объект куда направлен указатель константность не распространяется. ( Object* const object; ) Вы имеете право сами назначать уровень доступа в своей программе.


Для удобства баго устойчивости const придумали. На самом деле вам нужно написать куча вариантов метода. Это позволит обезопасить переменную object от случайных изменений. Вот пример возврата простого указателя и константного. Всё зависит от константности самого объекта.

class Composition
{
    public:
    Object* get()
    {
        return object;
    }
    Object const * get() const
    {
        return object;
    }
    Object const * const_get()const
    {
        return object;
    }
    Object * free_get() const
    {
        return object ;
    }
    private:
    Object* object;
};

Но вы можете всегда возвращать на константный объект в любом случае. Или всегда свободный. Всё зависит от вашей программы , семантики этого объекта.

→ Ссылка
Автор решения: AR Hovsepyan

Неконстантные методы вызываются только для неконстантных объектов. Методы со спецификаторами const являются явным указанием того, что метод не изменяет состояние объекта, и этот метод можно вызвать для константных объектов. Значит, когда нужно получать некоторую информацию об объекте, то мы делаем метод константным, чтобы была возможность получать эту информацию и о константных объектах

→ Ссылка
Автор решения: Victor Bomberow

Формально, в ООП не рассматривается понятие "указателя", но понятие "ссылка" выводится из такого взаимоотношения классов, когда Агрегатор заинтересован в конкретных экземплярах определенного класса.

Строчки зрения формального ООП, указатель на тип есть всего лишь тип. То, как он трактуется некоторым контекстом не имеет значения. Потому, если член класса типа some_type, а тип возвращаемого значения some_type*, то модификатор функции-члена const относится только к методу, к его коду, который не изменяет значение типа some_type*.

Данный const не относится к использованию метода и значению для предметной модели.

Неизменность состояния класса лучше всего на текущий момент выражается через наименование метода.

→ Ссылка