Отказ от ответственности: я знаю, что есть два вопроса о полезности константной корректности, однако ни один из них не обсуждал, как константная корректность необходима в C ++ по сравнению с другими языками программирования. Кроме того, я не удовлетворен с ответами на эти вопросы.
Сейчас я использовал несколько языков программирования, и одна вещь, которая меня беспокоит в C ++, - это понятие константной корректности. Такого понятия нет в Java, C #, Python, Ruby, Visual Basic и т. Д., Похоже, это очень специфично для C ++.
Прежде чем вы порекомендуете мне C ++ FAQ Lite, я прочитал его, и он меня не убеждает. Совершенно правильные, надежные программы все время пишутся на Python, и нет ключевого слова const или эквивалента. В Java и C # объекты могут быть объявлены как final (или const), но не существует константных функций-членов или константных параметров функций. Если функции не требуется изменять объект, она может использовать интерфейс, который предоставляет только доступ для чтения к объекту. Эту технику в равной степени можно использовать и в C ++. В двух реальных системах C ++, над которыми я работал, константа использовалась очень мало, и все работало нормально. Так что я далек от того, чтобы позволить константе загрязнять кодовую базу.
Мне интересно, что делает const в C ++ необходимой, в отличие от других языков программирования.
Пока что я видел только один случай, когда нужно использовать const :
#include <iostream>
struct Vector2 {
int X;
int Y;
};
void display(/* const */ Vector2& vect) {
std::cout << vect.X << " " << vect.Y << std::endl;
}
int main() {
display(Vector2());
}
Компиляция с закомментированной константой принимается Visual Studio, но с предупреждением C4239, использовано нестандартное расширение. Итак, если вы хотите синтаксической краткости передачи временных файлов, избегания копий и сохранения соответствия стандартам, вы должны передавать по константной ссылке, ни в коем случае. Тем не менее, это больше похоже на причуду, чем на фундаментальную причину.
В противном случае действительно нет ситуации, когда нужно использовать const, кроме случаев взаимодействия с другим кодом, который использует const. Const мне кажется не чем иным, как самодовольной чумой, которая распространяется на все, к чему прикасается:
Причина, по которой const работает в C ++, заключается в том, что вы можете отказаться от нее. Если бы вы не могли его выбросить, ваш мир был бы отстойным. Если вы объявляете метод, который принимает константу Bla, вы можете передать ему неконстантную Bla. Но если наоборот, нельзя. Если вы объявляете метод, который принимает неконстантный Bla, вы не можете передать ему const Bla. Итак, теперь вы застряли. Итак, вам постепенно понадобится константная версия всего, что не константно, и вы получите теневой мир. В C ++ это сходит с рук, потому что, как и все в C ++, совершенно необязательно, нужна вам эта проверка или нет. Вы можете просто отбросить константность, если она вам не нравится.
Андерс Хейлсберг (архитектор C #), Выбор дизайна CLR
wxStyledTextCtrl
имеет всеGetXXX
методы неконстантные!). Если бы C ++ не позволял мне это делать, я бы застрял в этом дерьмовом API и позволил бы ему заразить дизайн моего класса. - person Johannes Schaub - litb   schedule 03.09.2009final
в java илиreadonly
в C # (хотя я не думаю, что только чтение может применяться к аргументам функции). Я ошибся? - person Mel   schedule 09.07.2013void * memcpy (void *, const void *, size_t);
- person cp.engr   schedule 29.07.2015