Выбрать главу
Спецификатор типа const

Переменные, объявленные с использованием спецификатора const, не могут изменить свои значения во время выполнения программы. Однако любой const-переменной можно присвоить некоторое начальное значение. Например, при выполнении инструкции

const double version = 3.2;

создается double-переменная version, которая содержит значение 3.2, и это значение программа изменить уже не может. Но эту переменную можно использовать в других выражениях. Любая const-переменная получает значение либо во время явно задаваемой инициализации, либо при использовании аппаратно-зависимых средств. Применение спецификатора const к объявлению переменной гарантирует, что она не будет модифицирована другими частями вашей программы.

Спецификатор const предотвращает модификацию переменной при выполнении программы.

Спецификатор const имеет ряд важных применений. Возможно, чаще всего его используют для создания const-параметров типа указатель. Такой параметр-указатель защищает объект, на который он ссылается, от модификации со стороны функции. Другими словами, если параметр-указатель предваряется ключевым словом const, никакая инструкция этой функции не может модифицировать переменную, адресуемую этим параметром. Например, функция code() в следующей короткой программе сдвигает каждую букву в сообщении на одну алфавитную позицию (т.е. вместо буквы 'А' ставится буква 'Б' и т.д.), отображая таким образом сообщение в закодированном виде. Использование спецификатора const в объявлении параметра не позволяет коду функции модифицировать объект, на который указывает этот параметр.

#include <iostream>

using namespace std;

void code(const char *str);

int main()

{

 code("Это тест.");

 return 0;

}

/* Использование спецификатора const гарантирует, что str не может изменить аргумент, на который он указывает.

*/

void code(const char *str)

{

 while(*str) {

  cout << (char) (*str+1);

  str++;

 }

}

Поскольку параметр str объявляется как const-указатель, у функции code() нет никакой возможности внести изменения в строку, адресуемую параметром str. Но если вы попытаетесь написать функцию code() так, как показано в следующем примере, то обязательно получите сообщение об ошибке, и программа не скомпилируется.

// Этот код неверен.

void code(const char *str)

{

 while(*str) {

  *str = *str + 1; // Ошибка, аргумент модифицировать нельзя.

  cout << (char) *str;

  str++;

 }

}

Поскольку параметр str является const-указателем, его нельзя использовать для модификации объекта, на который он ссылается.

Спецификатор const можно также использовать для ссылочных параметров, чтобы не допустить в функции модификацию переменных, на которые ссылаются эти параметры. Например, следующая программа некорректна, поскольку функция f() пытается модифицировать переменную, на которую ссылается параметр i.

// Нельзя модифицировать const-ссылки.

#include <iostream>

using namespace std;

void f(const int &i);

int main()

{

 int к = 10;

 f(к);

 return 0;

}

// Использование ссылочного const-параметра.

void f (const int &i)

{

 i = 100; // Ошибка, нельзя модифицировать const-ссылку.

 cout << i;

}

Спецификатор const еще можно использовать для подтверждения того, что ваша программа не изменяет значения некоторой переменной. Вспомните, что переменная типа const может быть модифицирована внешними устройствами, т.е. ее значение может быть установлено каким-нибудь аппаратным устройством (например, датчиком). Объявив переменную с помощью спецификатора const, можно доказать, что любые изменения, которым подвергается эта переменная, вызваны исключительно внешними событиями.