In C++ kunnen de parameters van een functie (inclusief methodelid) als volgt worden doorgegeven:
Voorbeeld:
void foo(int value); // per waarde void foo(int* ptr); // per pointer void foo(const int& ref); // per referentie (optimaal voor grote objecten!)
Bij doorgeven per referentie is het mogelijk om optimalisatie (copy elision) te implementeren, en voor grote objecten wordt const & aanbevolen. Controleer altijd op nullptr voor pointers.
Wat is het verschil tussen
const MyClass& objenMyClass objin functieparameters?
Antwoord:
const MyClass& kopieert het object niet, maar biedt alleen toegang zonder het te kunnen wijzigen (optimaal voor grote objecten). MyClass obj maakt altijd een kopie, wat kostbaar is bij grote afmetingen of bij gebrek aan correcte kopie (bijvoorbeeld als deep copy niet is geïmplementeerd).
void process(const std::string& s); // Kopieert niet void process(std::string s); // Kopieert
Verhaal In de bedrijfsbibliotheek voor wiskundige structuren besloot een programmeur de prestaties te verhogen door grote containers per waarde door te geven. Dit veroorzaakte aanzienlijke overhead bij elke functieaanroep — de prestaties daalden met de helft.
Verhaal In de gebruikersbeheermodule werden pointers gebruikt zonder controle op
nullptr. Soms traden willekeurige fouten op bij toegang tot ongeldige pointers, de debugtijd duurde maanden.
Verhaal In een afbeeldingsverwerkingsproject accepteerde een deel van de functies objecten per waarde, terwijl een ander deel ze per referentie accepteerde. Voor een van de klassen was deep copy niet geïmplementeerd, wat leidde tot geheugenlekken en impliciete gedeelde eigendom van resources na overdracht per waarde.