In C++ können Funktionsparameter (einschließlich Methodenparameter) wie folgt übergeben werden:
Beispiel:
void foo(int value); // by value void foo(int* ptr); // by pointer void foo(const int& ref); // by reference (optimal für große Objekte!)
Bei der Übergabe per Referenz kann eine Optimierung (Copy Elision) implementiert werden, und für große Objekte wird const & empfohlen. Bei Zeigern sollte immer auf nullptr überprüft werden.
Was ist der Unterschied zwischen
const MyClass& objundMyClass objin Funktionsparametern?
Antwort:
const MyClass& kopiert das Objekt nicht, sondern bietet Zugriff ohne Änderungsmöglichkeit (optimal für große Objekte). MyClass obj erzeugt immer eine Kopie, was bei großen Größen oder fehlender korrekter Kopierung (z. B. wenn kein Deep Copy implementiert ist) teuer ist.
void process(const std::string& s); // Kopiert nicht void process(std::string s); // Kopiert
Geschichte In der Unternehmensbibliothek für mathematische Strukturen beschloss der Programmierer, die Arbeit zu beschleunigen, indem er große Container per Wert übergab. Dies verursachte erhebliche Mehrkosten bei jedem Funktionsaufruf – die Leistung halbierte sich.
Geschichte Im Modul zur Benutzerverwaltung wurden Zeiger ohne Überprüfung auf
nullptrverwendet. Manchmal kam es zu zufälligen Abstürzen beim Zugriff auf ungültige Zeiger, die Fehlersuche dauerte Monate.
Geschichte Im Projekt zur Bildbearbeitung akzeptierte ein Teil der Funktionen Objekte per Wert, während ein anderer Teil sie per Referenz entgegennahm. Für eine der Klassen wurde kein Deep Copy implementiert, was zu Speicherlecks und implizitem gemeinschaftlichem Ressourcenbesitz nach der Übergabe per Wert führte.