2012-01-03 11 views
58

Czytałem moją książkę C++ (Deitel), gdy natknąłem się na funkcję do obliczania objętości sześcianu. Kod jest następujący:Czy "const" nie jest nadmiarowy podczas przekazywania wartości?

double cube (const double side){ 
    return side * side * side; 
} 

Wyjaśnienie za pomocą „const” kwalifikator było to jedno: „const kwalifikacje powinny być wykorzystywane do egzekwowania Zasada najmniejszego uprzywilejowania, informując kompilator, że funkcja nie modyfikuje strona zmienna ".

Moje pytanie: czy użycie "const" nie jest tu zbędne/niepotrzebne, ponieważ zmienna jest przekazywana przez wartość, więc funkcja nie może jej zmodyfikować?

+5

Znaczenie 'const' tutaj jest to, że nie można zmodyfikować' 'side' parametru wewnątrz sześcianu()' metody, aby uniknąć nieoczekiwanego zachowania. –

+1

Czasami sprawy dotyczą raczej "dobrej praktyki" niż konieczności. Myślę, że to jeden z tych czasów. – destan

+2

Myślę, że odpowiedzi dobrze wyjaśniły, dlaczego tak robisz, ale dodam to do zewnętrznego wywołującego, 'const' * jest * nadmiarowy i nie jest częścią sygnatury funkcji. Oznacza to, że możesz go zostawić w deklaracji funkcji bez zmiany czegokolwiek. Możesz również usunąć go później, jeśli z jakiegoś powodu chcesz, aby twój kod był mniej łatwy w utrzymaniu i nie wpłynie to na kod wywołujący. –

Odpowiedz

82

Kwalifikator const zapobiega modyfikowaniu parametru przez kod wewnątrz funkcji. Kiedy funkcja jest większa niż niewielki rozmiar, takie zapewnienie pomaga szybko odczytać i zrozumieć funkcję. Jeśli wiesz, że wartość side nie zmieni się, nie musisz się martwić o śledzenie jej wartości w miarę czytania. W pewnych okolicznościach może to nawet pomóc kompilatorowi wygenerować lepszy kod.

Niezwykła liczba osób robi to w sposób oczywisty, biorąc pod uwagę ogólnie dobry styl.

+0

Ma sens. Dzięki. –

+5

Dlaczego "również"? To * wszystko * to robi. –

+0

@KeithThompson - rzeczywiście, to wszystko, co robi, ale O.P. myśli o parametrach const ref, gdzie 'const' powstrzymuje cię przed zmianą oryginalnego obiektu. –

43

można zrobić coś takiego:

int f(int x) 
{ 
    x = 3; //with "const int x" it would be forbidden 

    // now x doesn't have initial value 
    // which can be misleading in big functions 

} 
+10

+1 za ilustrację :) –

Powiązane problemy