Создание переменной i типа int, значение которой нельзя изменить:
const int i = 2;
const int i(2);
int consts i = 2;
int consts i(2);
Если объявленную одним из вышеперечисленных способов переменную i попробовать изменить (т.е. написать что-то вроде i = 3;), программа не скомпилируется.
Использовать const таким образом можно вместо директивы препроцессора #define, для определения размерности массива и т.д.
Указатели
Использование const с указателями несколько сложнее, так приходится познакомиться с его новым свойством - этот модификатор может защищать как сам указатель, так и данные, на которые последний указывает.
Изменяемые (перенаправляемые) указатели на неизменяемые символы:
const char *buff = "b";
char const *buff = "b";
После такого объявления можно изменить (перенаправить) указатель, но нельзя изменить данные, на которые он указывает:
buff = "a"; // ОК
buff = 'a'; // Не скомпилируется, и правильно сделает
Неизменяемый указатель на символы, которые можно изменить:
char * const buff;
После такого объявления уже нельзя изменить (перенаправить) указатель, но можно поменять данные, на которые он указывает:
|
|
buff = "a"; // Не скомпилируется
buff = 'a'; // ОК
Общее правило таково - если const расположен слева от знака *, то он защищает данные, иначе - указатель на них.
Использовать const таким образом можно для контроля за значением указателей и данных, на которые они указывают.
Ссылки
Ссылка, через которую нельзя поменять значение:
int a = 2;
const int &iBuff = a;
int const &iBuff = a;
int & const iBuff = a;
В данном примере я намерянно установил значения, т.к. без этого объявленная ссылка не имеет смысла, ведь через нее нельзя менять значения.
const int &iBuff; // Редкая фигня. Если вы не понимаете почему так — стоит разобраться прежде, чем идти дальше.
Параметры
Символы буфера не могут быть изменен внутри функции:
void SomeFunction(const char *buff); // или (char const *buff)
void SomeFunction(const char &buff); // или (char const &buff)
Обратите внимание, что правило (для указателей) о расположении const слева или справа от знака * здесь также работает:
void SomeFunction(char & const buff); // Защита копии указателя. Бессмысленно.
Такое использование модификатора очень полезно, оно позволяет защищать данные, передаваемые в качестве параметров, от изменения внутри функции.