Учись программированию на C++ Builder бесплатно!
  • Главная
  • Применение в функции спецификации const при передаче параметров
Применение в функции спецификации const при передаче параметров

Иногда требуется решать задачу: избавиться от копирования громоздких аргументов типа больших массивов. Но при этом не требуется позволять функции изменять значения аргументов. Это может быть осуществлено передачей в функцию аргументов как констант. Для этого перед соответствующими переменными в списке ставится ключевое слово const. При использовании ссылочного параметра заголовок функции (именно заголовок описания, поскольку в прототипе спецификатор const указывать не обязательно) может иметь следующий вид:

double F(const &A);

В этом случае аргумент А не будет копироваться при вызове функции, но внутри функции изменить значение А будет невозможно. При попытке сделать такое изменение компилятор выдаст сообщение: «Cannot modify a const object».

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

  • неконстантный указатель на неконстантные данные;
  • неконстантный указатель на константные данные;
  • константный указатель на неконстантные данные;
  • константный указатель на константные данные.

Каждая комбинация обеспечивает доступ с разным уровнем привилегий.

Неконстантным указателем на неконстантные данные

Наивысший уровень доступа предоставляется неконстантным указателем на неконстантные данные – данные можно модифицировать посредством разыменования указателя, а сам указатель может быть модифицирован, чтобы он указывал на другие данные. В этом варианте передачи параметров спецификатор const не используется.

Неконстантный указатель на константные данные

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

Прототип функции

void F(const char *sPtr);

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

Константный указатель на неконстантные данные

Константный указатель на неконстантные данные – это указатель, который всегда указывает на одну и ту же ячейку памяти, данные в которой можно модифицировать посредством указателя. Этот вариант, например, реализуется по умолчанию для имени массива. Имя массива – это константный указатель на начало массива. Используя имя массива и индексы массива можно обращаться ко всем данным в массиве и изменять их.

Прототип функции

void F(char *const sPtr);

Константный указатель на константные данные

Наименьший уровень привилегий доступа предоставляет константный указатель на константные данные. Такой указатель всегда указывает на одну и ту же ячейку памяти и данные в этой ячейке нельзя модифицировать. Это выглядит так, как если бы массив нужно было передать функции, которая только просматривает массив, использует его индексы, но не модифицирует сам массив.

Прототип функции

void F(const char *const sPtr);

Поиск по сайту