Russian Belarusian English German Japanese Ukrainian
  • Главная
  • Применение при передаче параметров спецификации 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);

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


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