Dlaczego stała poprawność jest specyficzna dla C ++?

Zastrzeżenie: Zdaję sobie sprawę, że istnieją dwa pytania dotyczące użyteczności poprawności poprawnej, jednak żadna nie dyskutowała o tym, jak konieczna jest poprawność const w C ++w przeciwieństwie do innych języków programowania. Nie jestem też zadowolony z odpowiedzi udzielonych na te pytania.

Użyłem już kilku języków programowania, a jedną z rzeczy, która mnie niepokoi w C ++, jest pojęcie poprawności. W języku Java, C #, Python, Ruby, Visual Basic itd. Nie ma takiego pojęcia. Wydaje się, że jest to bardzo specyficzne dla C ++.

Zanim skierujesz mnie do C ++ FAQ Lite, przeczytałem to i nie przekonuje mnie. Doskonale sprawdzone, niezawodne programy są pisane w Pythonie przez cały czas i nie ma ani słowa kluczowego const, ani jego odpowiednika. W Javie i C # obiekty można zadeklarować jako ostateczne (lub stałe), ale nie ma stałych funkcji składowych ani stałych parametrów funkcji. Jeśli funkcja nie musi modyfikować obiektu, może przyjąć interfejs, który zapewnia tylko dostęp do odczytu obiektu. Ta technika może być również używana w C ++. Na dwóch rzeczywistych systemach C ++, nad którymi pracowałem, użycie const było bardzo małe i wszystko działało dobrze. Nie jestem więc zbytnio zainteresowany przydatnością pozwalającą const zanieczyszczać bazę kodu.

Zastanawiam się, co to jest w C ++, co sprawia, że ​​const jest konieczne,w przeciwieństwie do innych języków programowania.

Do tej pory widziałem tylko jeden przypadek, w którym constmusi być użytym:

#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());
}

Kompilowanie tego ze skomentowanym const jest akceptowane przez Visual Studio, ale z ostrzeżeniemC4239, zastosowano niestandardowe rozszerzenie. Tak więc, jeśli chcesz składniową zwięzłość przekazywania tymczasowych, unikania kopii i pozostawania zgodnym ze standardami, musisz przejść przez referencję const, bez możliwości obejścia. Mimo to jest to raczej dziwactwo niż podstawowy powód.

W przeciwnym razie tak naprawdę nie ma sytuacji, w której const musiałoby zostać użyte, z wyjątkiem sytuacji, w których współdziałamy z innym kodem, który używa const. Const wydaje mi się czymś więcej niż samozwańczą plagą, która rozprzestrzenia się na wszystko, czego dotyka:

Powodem, dla którego const działa w C ++, jest to, że możesz go odrzucić. Gdybyś nie mógł go odrzucić, twój świat by ssał. Jeśli zadeklarujesz metodę, która przyjmuje stałą Bla, możesz przekazać jej nie-stały Bla. Ale jeśli jest odwrotnie, nie możesz. Jeśli zadeklarujesz metodę, która przyjmuje nie-stały Bla, nie możesz przekazać jej stałej Bla. Więc teraz utknąłeś. Więc stopniowo potrzebujesz stałej wersji wszystkiego, co nie jest stałe, a skończysz ze światem cieni. W C ++ unikasz tego, ponieważ jak w przypadku C ++ jest to czysto opcjonalne, niezależnie od tego, czy chcesz to sprawdzić, czy nie. Możesz po prostu wyrzucić bryłę, jeśli ci się to nie podoba.

Anders Hejlsberg (C # architect),Wybory projektowe CLR

questionAnswers(14)

yourAnswerToTheQuestion