W C++ parametry funkcji (w tym członki metod) można przekazywać:
Przykład:
void foo(int value); // przez wartość void foo(int* ptr); // przez wskaźnik void foo(const int& ref); // przez referencję (optymalnie dla dużych obiektów!)
Przy przekazywaniu przez referencję możliwa jest optymalizacja (copy elision), a dla dużych obiektów zaleca się const &. Dla wskaźników zawsze sprawdzaj na nullptr.
Czym różni się
const MyClass& objodMyClass objw parametrach funkcji?
Odpowiedź:
const MyClass& nie kopiuje obiektu, a jedynie udostępnia dostęp bez możliwości zmiany (optymalnie dla dużych obiektów). MyClass obj zawsze wykonuje kopię, co jest kosztowne przy dużych rozmiarach lub przy braku poprawnego kopiowania (np. brak implementacji deep copy).
void process(const std::string& s); // Nie kopiuje void process(std::string s); // Kopiuje
Historia W korporacyjnej bibliotece struktur matematycznych programista postanowił przyspieszyć pracę, przekazując duże kontenery przez wartość. Powodowało to znaczne obciążenia przy każdym wywołaniu funkcji — wydajność spadła o połowę.
Historia W module zarządzania użytkownikami używano wskaźników bez sprawdzania na
nullptr. Czasami dochodziło do przypadkowych awarii przy odwołaniach do nieważnych wskaźników, a debugowanie zajmowało miesiące.
Historia W projekcie przetwarzania obrazów część funkcji przyjmowała obiekty przez wartość, a część przez referencję. Dla jednej z klas nie zaimplementowano deep copy, co powodowało wycieki pamięci i niejawne współdzielenie zasobów po przekazaniu przez wartość.