В C++ подпись функции частично зависит от того, константа она или нет. Это означает, что у класса могут быть две функции-члены с идентичными сигнатурами, за исключением того, что одна является константой, а другая - нет. Если у вас есть такой класс, то компилятор будет решать, какую функцию вызывать, в зависимости от объекта, для которого вы его вызываете: если это константный экземпляр класса, будет вызываться константная версия функции; если объект не является константным, будет вызвана другая версия.
В каких обстоятельствах вы можете воспользоваться этой функцией?





Это там, чтобы вы могли заставить компилятор принудительно возвращать константный объект или обычный, и при этом поддерживать ту же сигнатуру метода. Подробное объяснение есть на Постоянная правильность.
Возможно, вы захотите использовать его, чтобы решить, следует ли возвращать константную ссылку на объект или нет. Контейнеры STL используют перегруженные константные функции begin () и end (), чтобы решить, возвращать ли const_iterator или обычный итератор.
Это действительно имеет смысл только тогда, когда функция-член возвращает указатель или ссылку на член данных вашего класса (или член члена, или член члена члена, ... и т. д.). Обычно возврат неконстантных указателей или ссылок на элементы данных не одобряется, но иногда это разумно или просто очень удобно (например, оператор []). В таких случаях вы предоставляете константную и неконстантную версии получателя. Таким образом, решение о том, можно ли изменить объект, остается за функцией, которая его использует, у которой есть выбор: объявить его константным или неконстантным.
Посмотрите на поведение std :: map :: operator []. Константная версия выдает ошибку, если вы пытаетесь сослаться на недопустимый ключ, а неконстантная версия выполняет вставку. Поведение при вставке намного удобнее, чем использование std :: map :: insert (и, кроме того, перезапись), но не может работать для константной карты.
#include <iostream>
using namespace std;
class base
{
public:
void fun() const
{
cout<<"have fun";
}
void fun()
{
cout<<"non const";
}
};
int main()
{
base b1;
b1.fun(); //does not give error
return 0;
}
Здесь компилятор не выдаст ошибки, потому что в случае использования функций const компилятор преобразует указатель this в const this*. этот третий аргумент разделяет эти две функции.
Вы не объяснили, зачем вообще нужен квалификатор
constдля функций-членов.