2010-12-08 3 views
1

В Java мы можем указать строку как final, чтобы объявить константы. НапримерC++ Конечные константные строки

static final String myConst = "Hello"; 

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

const char * const myConst = "Hello"; 

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

const char * myConst = "Hello"; 

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

+1

no Вы не можете изменить то, на что указывает указатель. Однако вы можете изменить указатель. – 2010-12-08 20:47:21

+1

FYI, на C++ вы должны прочитать это назад. `const char * myConst` читается:« myConst - это указатель на символ, который является постоянным ». `const char * const myConst` читается как« myConst - постоянный указатель на символ, который является постоянным ». – 2010-12-08 20:49:59

+0

В большинстве случаев вы видите, что последний вариант, тот, кто написал заявление, просто не знал ничего лучшего. – aschepler 2010-12-08 20:50:54

ответ

5

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

Или лучше:

#include <string> 
const std::string myConst = "Hello"; 
0

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

const char * const myConst = "Hello"; 

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

const char * myConst = "Hello"; 

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

0

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

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

0

Технически

char * const myConst = "Hello"; 

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

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

char const * const myConst = "Hello"; 

отличная идея. Лично, как

char const * myConst = ...; 

и Const символ * myCount = ...;

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

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

1
const char * myConst = "Hello"; 

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

char * const myConst = "Hello"; 

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

const char * const myConst = "Hello"; 

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

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

0

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

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

0

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

Имея это в виду, я бы, вероятно, пойти на другое решение в любом случае:

const char myConst[] = "Hello"; 

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

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

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

Смежные вопросы