Po pierwsze, wszystkie podane przez ciebie definicje są poprawne składniowo. Jeśli się kompilują, to są poprawne pod względem składni.
Kwalifikator dla parametrów ma tylko jeden cel: uniemożliwić modyfikowanie argumentów funkcji przez modyfikację argumentów funkcji const
.
W konkretnym przypadku przykładowego kodu metoda Foo::bar
nie modyfikuje argumentów, więc użycie kwalifikatora const
nie ma żadnego wpływu.
Jednak domyślnie możesz używać domyślnie const
i usuwać go tylko w sytuacjach, w których chcesz zezwolić na modyfikacje. Stąd zastosowanie go do parametrów Foo::bar
jest dobrym pomysłem. Myślę, że to dobra praktyka, choć przyznam, że rzadko jej używam, ze względu na nieco hałasu, który może powodować zmniejszenie czytelności.
Inną kwestią, którą należy wziąć pod uwagę, jest to, że w przypadku typów pierwotnych, a dokładniej typów, które nie są wskaźnikami lub nie zawierają wskaźników, modyfikowanie argumentu przekazanego przez wartość (tj. Nie przez odniesienie) nie będzie miało żadnych skutków ubocznych: parametry te typy naprawdę działają jako zainicjowane zmienne lokalne (które mogą być przydatne, ale mogą również być mylące). W przypadku wskaźników każda modyfikacja wskazanych danych wycieknie do świata zewnętrznego. To kolejny dobry powód, aby użyć kwalifikatora const
zarówno na wskaźniku, jak i na wskazanej części typu.
Podsumowując, użycie kwalifikatora const
w jak największym stopniu pomoże uczynić kod mniej podatnym na błędy, a także pomoże kompilatorowi zoptymalizować wynikowy program.
Korzystanie z odniesienia dla tych typów nie należy jednak dokonywać żadnych znaczących zmian, jeśli te typy opisują wartości montażu w rejestrze procesora (co zwykle ma miejsce),
Tak, wszystkie trzy wersje metody powinny sprowadza się do tego samego wygenerowanego kodu zespołu.
W szczególnym przypadku pierwotnych typów zwracanych nie ma znaczenia. wartość zwracana może być konwertowana do iz powrotem do kwalifikowanej wartości.
Inni wspomnieli także o interesie kwalifikatora const
na samej funkcji. Chociaż z pierwotnego zakresu pytań, powiem również, że jest rzeczywiście lepiej, gdy to możliwe (jak na Foo::bar
), aby zakwalifikować funkcję jako const
.
Funkcja członka +1 stałego (choć pomocne uzupełnienie tego, co zadawał OP). – wmorrison365
"dzwoniący może chcieć zmodyfikować zwróconą wartość" - chociaż będą potrzebowali 'const_cast' (lub rzutowania w stylu C), ponieważ jest to wyrażenie rvalue typu pierwotnego. Więc nawet jeśli nie jest to const, nie mogą uzyskać odniesienia do niego bez rzutowania. Nie jestem pewien, czy jest to coś, * czego * naprawdę * potrzebujemy wspierać, ale co ważniejsze, jeśli twoja funkcja zwraca obiekt typu const o 'const', który jest ogólnie zły, ponieważ uniemożliwia to przejście z niego lub wywołanie jego funkcji składowych. –
Jeszcze jeden szczegół, jeśli typem powrotu był 'bool', dobrze jest go" const "unikać przypadkowego przypisania w wyrażeniach warunkowych. Można tego uniknąć, wykręcając ostrzeżenia kompilatora, ale po ugryzieniu dwa razy nieśmiałe. –