Данные и константы

Создание переменной 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); // Защита копии указателя. Бессмысленно.

Такое использование модификатора очень полезно, оно позволяет защищать данные, передаваемые в качестве параметров, от изменения внутри функции.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: