Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 3-4n.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
74.69 Кб
Скачать

Int m_value;

Anything (): m_value (0) { }

void setValue (int value) { m_value = value; }

Int getValue () { return m_value ; }

};

Int main () {

const Anything anything; // вызываем конструктор по умолчанию

anything.m_value = 7; // ошибка компиляции: нарушение const

anything.setValue (7); // ошибка компиляции: нарушение const

return 0;

}

2 строки вызовут ошибки компиляции, так как они нарушают принципы константности объекта, пытаясь напрямую изменить переменную-член и вызывая сеттер для изменения значения переменной-члена.

Константные методы классов

Теперь рассмотрим следующую строку кода:

std::cout << anything.getValue ();

Удивительно, но это также вызовет ошибку компиляции, хотя метод getValue () не делает ничего для изменения переменной-члена!

Оказывается, что константные объекты класса могут явно вызывать только константные методы класса, а getValue () не указан, как константный метод. 

Константный метод — это метод, который гарантирует, что не будет изменять объект или вызывать неконстантные методы класса (поскольку они могут изменить объект).

Чтобы сделать getValue() константным, нужно просто добавить ключевое слово const к прототипу функции  после списка параметров, но перед телом функции:

class Anything {

public:

Int m_value;

Anything () {m_value= 0;}

void resetValue () {m_value = 0;}

void setValue (int value) {m_value = value;}

int getValue () const {return m_value;} // ключевое слово const //находится после списка параметров, но перед телом функции

};

Теперь getValue () является константным методом. Это означает, что мы можем вызывать его через любой константный объект.

Для методов, определенных вне тела класса, ключевое слово const должно использоваться как в прототипе функции (в теле класса), так и в определении функции:

class Anything {

public:

Int m_value;

Anything () {m_value= 0;}

void resetValue () {m_value = 0;}

void setValue (int value) {m_value = value;}

int getValue () const; // обратите внимание на ключевое слово const

};

int Anything::getValue () const { // и здесь

return m_value;

}

Кроме того, любой константный метод, который пытается изменить переменную-член или вызвать неконстантный метод класса, также приведет к ошибке компиляции, например:

class Anything {

public:

Int m_value;

void resetValue () const {m_value = 0;} // ошибка компиляции, /константные методы не могут изменять переменные-члены класса

};

В этом примере метод resetValue () был установлен константным, но он пытается изменить значение m_value. Это вызовет ошибку компиляции.

Обратите внимание, конструкторы не могут быть константными!

Это связано с тем, что они должны иметь возможность инициализировать переменные-члены класса, а константный конструктор этого не может сделать.

Следовательно, в языке С++ константные конструкторы запрещены. Метить, что константный объект класса может вызывать будет их инициализировать вообще!

Правило: Делайте все ваши методы, которые не изменяют данные объекта класса, константными.