Константные параметры

Если внутри функции значение параметра не изменяется, то такой параметр следует объявить константным. Для этого при объявлении перед параметром указывается ключевое слово const. Например, функция print(), предназначенная для вывода сообщения, не производит изменение значения параметра, поэтому параметр следует объявить константным. Кроме того, это позволит передавать в функцию литерал строки:

void print(const char *s) {
   std::cout << s << std::endl;
}

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

void print(const char *s);
void print(char const *s);
void print(char * const s);
void print(const char * const s);

Первые два объявления являются эквивалентными. В этом случае изменить значение, на которое ссылается указатель, нельзя, но указателю можно присвоить другой адрес:

void print(const char *s) {
   char s2[] = "New";
   s = s2;                              // Нормально
   s[0] = 's';                          // Ошибка
   std::cout << s << std::endl;
}

При третьем объявлении изменить значение, на которое ссылается указатель, можно, но указателю нельзя присвоить другой адрес:

void print(char * const s) {
   char s2[] = "New";
   s = s2;                              // Ошибка
   s[0] = 's';                          // Нормально
   std::cout << s << std::endl;
}

Четвертое объявление запрещает изменение значения, на которое ссылается указатель, и присвоение другого адреса:

void print(const char * const s) {
   char s2[] = "New";
   s = s2;                              // Ошибка
   s[0] = 's';                          // Ошибка
   std::cout << s << std::endl;
}

С помощью оператора const_cast можно отменить действие ключевых слов const и volatile. Формат оператора:

const_cast< Тип_результата >(Выражение)

Пример приведения константного указателя в обычный внутри функции:

void print(const char *s) {
   //s[0] = 's';                        // Ошибка
   char *p = const_cast<char *>(s);
   p[0] = 's';                          // Нормально
   std::cout << s << std::endl;
}

Пример удаления действия ключевого слова const у ссылки внутри функции:

void func(const int &x) {
   //x = 50; // Ошибка!!!
   // Теперь можно изменить значение
   const_cast<int &>(x) = 30;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов