const (c ++) является необязательным? - PullRequest
4 голосов
/ 19 марта 2010

В соответствии с некоторыми уроками, которые я читал некоторое время назад, объявление "const" делает переменную "константой", то есть она не может измениться позже.
Но я нахожу это const-объявление abit неудобным, поскольку компилятор иногда выдает ошибки типа
"cannot convert const int to int"
или что-то типа того.

и я все равно обманываю, удаляя его.

вопрос: предполагая, что я стараюсь не менять переменную в моем исходном коде , могу ли я с радостью забыть об этом const?

Заранее спасибо

Ответы [ 11 ]

51 голосов
/ 19 марта 2010

Ты серьезно? Почему вы хотите отказаться от такой полезной функции только потому, что иногда допускаете ошибку? Лучше попытайтесь научиться избегать ошибок с const, и вы получите большую помощь, которую он добавляет, чтобы обеспечить исправление вашего кода.

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

14 голосов
/ 19 марта 2010

В C ++ «const» может применяться к переменной (делая ее неизменной) или к функции (делая ее неспособной изменить другие вещи).

Я использую «const» не только для того, чтобы помешать моему коду изменить мою переменную. Это сделано для того, чтобы код какого-то идиота не изменил мою переменную (особенно, если идиот - это я через шесть месяцев) и чтобы мой код не мог изменить критическую переменную, которую оставил какой-то идиот (особенно, если идиот был мной шесть месяцев назад).

6 голосов
/ 19 марта 2010

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

Появляется сообщение об ошибке, потому что вы пытаетесь изменить const int. Просто присваивая значение (неконстантному) int, вы изменяете его, как хотите.

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

3 голосов
/ 19 марта 2010

Вы теряете некоторые полезные языковые функции без констант, особенно в отношении ссылок. Рассмотрим:

void f(const MyClass& m);
void f(const int& i);

// ...

f(MyClass()); // OK, can pass temporary as const reference
f(5); // OK as well, 5 is a temporary int

Если вы считаете «const» необязательным и избавляетесь от него:

void f(MyClass& m);
void f(int& i);

// ...

f(MyClass()); // Error, cannot pass temporary as non-const reference
f(5); // Error, same as above
3 голосов
/ 19 марта 2010

Даже если вы и все, с кем вы работаете, никогда не ошибаются, использование const в ваших объявлениях методов помогает документировать ваш интерфейс.

2 голосов
/ 19 марта 2010

Идея использования const заключается именно в том, что вы гарантируете ошибки компилятора при попытке изменить значение переменной, когда она была предопределена (с помощью const), которую вы НЕ хотите делать. По сути, он встроен в проверку ошибок и полезен по многим причинам.

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

const также фиксирует намерение не изменять и предотвращает случайное назначение.

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

Вот полезное объяснение, которое вы можете проверить: http://duramecho.com/ComputerInformation/WhyHowCppConst.html

1 голос
/ 19 марта 2010

Чтобы ответить на ваш вопрос первым:

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

Итак, в итоге вам лучше подумать о том, почему вы должны сделать что-то const, а когда - нет.

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

Рад видеть, что вы думаете о проблеме - это больше, чем большинство.

1 голос
/ 19 марта 2010

Это всегда необязательно. Если весь ваш код уверен, что вы можете забыть его (я бы не рекомендовал его, потому что он защищает вас), но когда вы взаимодействуете с другими, вы, по сути, предоставляете им контракт, который вы не измените их объект или вызов функция не меняет состояние вашего объекта. Это может быть неоценимо, если вы не знакомы с чужим кодом или у вас нет источника.

1 голос
/ 19 марта 2010

Вы можете забыть об этом, но разве это не хорошо, если компилятор навязывает это вам? Таким образом, ваши «постоянные» переменные на самом деле остаются постоянными.

0 голосов
/ 19 марта 2010

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

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