Распространено ли объявлять константные указатели в C ++? - PullRequest
4 голосов
/ 08 мая 2019

Руководства по стилю C ++ настоятельно рекомендуют объявлять объекты как const, если мы не собираемся их изменять.Из этого следует, что когда мы объявляем указатель на объект / переменную, который не будет переназначен, мы должны объявить его const:

T* const pObject = new T();

Просто кажется, что разработчики на C ++ обычно не следуют этому правилу врегистры указателей, не так ли?

Ответы [ 4 ]

8 голосов
/ 08 мая 2019

Указатель является объектом.

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

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

4 голосов
/ 08 мая 2019

Да, это хорошая практика, потому что она предотвращает непреднамеренное изменение ссылки.Вполне возможно, что вы можете изменить значение переменной где-то в вашем коде, не добавляя const, чтобы убедиться, что значения переменных нигде не изменились.

3 голосов
/ 08 мая 2019

Обычно ли объявлять константные указатели в C ++?

Это не так часто, как неконстантные указатели (не путать с указателем на констант против указателя на неконстантный; просто для ясности). Указатели обычно используются в качестве итератора для массива. Итерация требует модификации итератора.

Но это тоже не неслыханно.

T* const pObject = new T();

Любой приличный стиль кодирования в первую очередь советует не использовать голый указатель владения.

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

Очень редко указатель не может быть переназначен в какой-то момент. Если вам не нужна способность указывать на ноль, часто рекомендуется использовать ссылку, когда вам не требуется переназначение.

Даже в том случае, когда вам нужен указатель и не требуется переназначение, предпочтение константным объектам вместо неконстантных является лишь незначительно полезным руководством по стилю. Это в основном имеет существенное значение в случаях, которые теперь заменены на constexpr (что делает переменную неявно const). Как таковые, многие не следуют или даже могут не знать о таком стиле.

Однако не стесняйтесь следовать стилю, если вы того пожелаете.

3 голосов
/ 08 мая 2019

Указатель - это просто переменная, содержащая адрес, но, в конце концов, это переменная, как и любая другая.

Вы должны сделать указатель const по тем же причинам, что и простой int const. Так что если у вас есть веские причины иметь нормальную переменную const, то по тем же причинам вы должны стремиться к наличию const указателей.

Довольно часто (и я бы добавил, хорошая практика) в сообществе C ++ объявлять const указатели на const данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...