$ 9.3.1 / 3 состояния-
«Нестатическая функция-член может быть объявлена как const, volatile или const volatile. Эти cvqualifiers влияют на тип указателя this (9.3.2) Они также влияют на тип функции (8.3.5) функции-члена; функция-член, объявленная const, является функцией-членом const, функция-член, объявленная volatile, является изменчивой функцией-членом, а функция-член, объявленная const volatile, является членом const volatile. function. "
Итак, вот резюме:
a) Квалификатор const может использоваться только для нестатических функций-членов класса
b) квалификация cv для функции, участвующей в перегрузке
struct X{
int x;
void f() const{
cout << typeid(this).name();
// this->x = 2; // error
}
void f(){
cout << typeid(this).name();
this->x = 2; // ok
}
};
int main(){
X x;
x.f(); // Calls non const version as const qualification is required
// to match parameter to argument for the const version
X const xc;
xc.f(); // Calls const version as this is an exact match (identity
// conversion)
}
Квалификатор const в конце объявления функции-члена указывает, что функция может быть вызвана для объектов, которые сами являются константами. Функции-члены const обещают не изменять состояние каких-либо неизменяемых элементов данных.
Константные функции-члены также, конечно, могут вызываться для неконстантных объектов (и при этом делать то же самое).
Функции-члены также могут быть перегружены константностью. Например:
class A {
public:
A(int val) : mValue(val) {}
int value() const { return mValue; }
void value(int newVal) { mValue = newVal; }
private:
int mValue;
};
A obj1(1);
const A obj2(2);
obj1.value(3); // okay
obj2.value(3); // Forbidden--can't call non-const function on const object
obj1.value(obj2.value()); // Calls non-const on obj1 after calling const on obj2
Это означает, что он не изменяет объект, поэтому вы можете вызвать этот метод с помощью константного объекта.
т.е.
class MyClass {
public:
int ConvertToInteger() const;
};
Означает, что если у вас есть
const MyClass myClass;
, вы можете вызвать
int cValue = myClass.ConvertToInteger();
без ошибки компиляции, потому что объявление метода указывает, что он не изменяет данные объекта.