Главное меню » Практика » const и указатели в C++ — пора разобраться

const и указатели в C++ — пора разобраться

Указатели могут быть довольно запутанной темой для тех, кто недавно начала знакомство с C++. Еще более сложными для понимания они становятся при использовании в сочетании с модифкатором const. И, если ваш компилятор поддерживает стандарт C++11 (или более поздний), вам редко придется работаться обычными указателями вместо «умных» (std::shared_ptr и т.д.), синтаксис «классических» указателей необходимо понимать.

Для начала, давайте удостоверимся, что мы понимаем синтаксис объявления константных указателей и данных.

Существует удобный метод чтения таких объявлений, позволящий быстро понять, что они означают. Посмотрите на звездочки (*) и разделить строку объявления указателя на 2 части: слева от звездочки и справа от звездочки. Теперь вам будет гораздо проще понять, что является константным, а что нет. Давайте рассмотрим следующую строку в качестве примера:

Мы смотрим слева от звездочки и видим тип char без ключевого слова const, таким образом, данные в данном случае не являются константными, т.е. содержимое строки может быть изменено. Теперь мы смотрим справа от звездочки и видим const ptr. «Ага!», говорим мы, «указатель ptr константен». Таким образом, мы приходим к выводу, что приведенное выше объявление указателя ptr означает следующее: константный указатель на неконстантные данные.
Теперь, когда мы знаем как читать объявления указателей, мы могли бы задаваться вопросом, что именно означают термины «константные данные» и «константный указатель». На самом деле, это довольно просто: просто надо помнить, что и данные и указатель являются переменными (указатель является переменной, которая содержит в качестве значения адрес другой переменной ). Таким образом, такие понятия как «константные данные» и «константный указатель» на самом деле означают «константная переменная».
Итак, давайте подведем итог: выражение «константный указатель на некоторые данные» означает, что указатель, что после его инициализации, не может указывать на какие-либо другие данные, т.е. нельзя изменить адрес памяти, который содержит указатель. Выражение «константные данные» означает, что через данный указатель, мы не можем изменить данные, на которые он указывает (такие указатели очень полезны в качестве аргументов функции). Вот пример кода, демонстрирующий эти понятия (заметим, что для образовательных целей приведенный ниже код содержит строки, которые могут вызывать ошибки компиляции, однако они закомментированны, так что код должен собираться):

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

Источник: eli.thegreenplace.net


Теги: