Вы находитесь на странице: 1из 2

Константный метод — это метод, в котором невозможна модификация полей класса.

При
попытке изменения поля в константном методе, мы получим ошибку компиляции.
Например, имеет смысл делать константными get методы. Рассмотрим пример.

01.#include <iostream>
02.using namespace std;
03.
04.class Test
05.{
06.public:
07.
08.Test()
09.{
10.t = 0;
11.}
12.
13.void setValue(int val)
14.{
15.t = val;
16.}
17.
18.int getValue() const
19.{
20.return t;
21.}
22.
23.private:
24.int t;
25.};
26.
27.
28.void main()
29.{
30.Test test;
31.test.setValue(99);
32.cout<<test.getValue()<<endl;
33.}

В классе Test есть поле t, а также методы setValue() и getValue(). Мы сделали метод
getValue() константным, так как основное его назначение — вернуть значение поля t.

Ключевое слово mutable.

Если у нас ситуация, когда все-таки нужно изменить одно из полей в константном методе, то
такое поле делают mutable, т.е. изменяемым. Рассмотрим пример.

01.#include <iostream>
02.using namespace std;
03.
04.class Test
05.{
06.public:
07.
08.Test()
09.{
10.t = 0;
11.cnt = 0;
12.}
13.
14.void setValue(int val)
15.{
16.t = val;
17.}
18.
19.int getValue() const
20.{
21.cnt++;
22.
23.return t;
24.}
25.
26.void debug()
27.{
28.cout<<"cnt = "<<cnt<<endl;
29.}
30.
31.
32.private:
33.int t;
34.mutable int cnt;
35.};
36.
37.
38.void main()
39.{
40.Test test;
41.test.setValue(99);
42.cout<<test.getValue()<<endl;
43.
44.test.debug();
45.}

У нас есть поле cnt, которое представляет собой счетчик. В методе getValue() мы
увеличиваем наш счетчик на единицу. Таким образом, в поле cnt содержится количество
вызовов метода getValue(). Метод debug() выводит значение нашего счетчика.