Конечные константные строки c ++ - PullRequest
1 голос
/ 08 декабря 2010

В Java мы можем указать строку как final для объявления «констант». Например

static final String myConst = "Hello";

Является ли правильный способ сделать это в C ++, как это?

const char * const myConst = "Hello";

Я всегда видел, как люди делают это:

const char * myConst = "Hello";

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

Ответы [ 8 ]

12 голосов
/ 08 декабря 2010
const std::string myConst("Hello");
5 голосов
/ 08 декабря 2010

Да, const char* const - это правильный способ объявления строки в стиле C, который вы не измените.

Или лучше:

#include <string>
const std::string myConst = "Hello";
1 голос
/ 08 декабря 2010
const char * myConst = "Hello";

Это означает, что объект, на который указывает указатель, не может измениться.

char * const myConst = "Hello";

Это означает, что местоположение, на которое указывает указатель, не может измениться, но значение объекта может.

const char * const myConst = "Hello";

Это означает, что ни один не может измениться.По моему опыту, никто не помнит этого, но он всегда доступен в сети!

Обычно три человека отвечают, когда я пишу свой!

0 голосов
/ 08 декабря 2010

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

Имея это в виду, я, возможно, все равно выберу другое решение:

const char myConst[] = "Hello";

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

С его помощью я могу делать что-то вроде sizeof(myConst) и получать тот же результат, что и с sizeof("Hello").Если я изменю строку на указатель, то sizeof вернет размер указателя, а не размер строки ...

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

0 голосов
/ 08 декабря 2010

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

Поскольку это редко полезно, чаще всего вы хотите, чтобы значения в стеке (включая указатели) были неконстантными.Получите книгу «Стандарты кодирования» Саттера и Александреску, в которой объясняется этот момент.

0 голосов
/ 08 декабря 2010

Технически,

char * const myConst = "Hello";

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

Некоторые реализации позволяют изменятьсимволы в «Hello» (даже если это плохая идея), поэтому первая константа в

char const * const myConst = "Hello";

- отличная идея.Лично, поскольку

char const * myConst = ...;

и const char * myCount = ...;

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

Тем не менее, большинство людей не знают, как правильно использовать const в C ++, поэтому он либо используется плохо, либо не используется вообще.Это потому, что они просто используют C ++ как улучшенный компилятор Си.

0 голосов
/ 08 декабря 2010

С правкой Диего, да, это правильный способ написать это.Люди обычно не объявляют переменную const, потому что им все равно, будет ли она изменена, или, скорее, они уверены, что она не будет изменена (поскольку они знают , они не изменяют ее).

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

0 голосов
/ 08 декабря 2010

Я не совсем понимаю ваш вопрос. Чтобы более или менее имитировать ключевое слово Java final, это будет либо

const char * const myConst = "Hello";

(если указатель не будет меняться) и / или:

const char * myConst = "Hello";

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

...