En C++, les paramètres de fonction (y compris les membres des méthodes) peuvent être passés :
Exemple :
void foo(int value); // par valeur void foo(int* ptr); // par pointeur void foo(const int& ref); // par référence (optimal pour les grands objets !)
Lors du passage par référence, il est possible d'implémenter une optimisation (copy elision), et pour les grands objets, il est recommandé d'utiliser const &. Pour les pointeurs, vérifiez toujours sur nullptr.
Quelle est la différence entre
const MyClass& objetMyClass objdans les paramètres de la fonction ?
Réponse :
const MyClass& ne copie pas l'objet, mais fournit seulement un accès sans possibilité de modification (optimal pour les grands objets). MyClass obj effectue toujours une copie, ce qui est coûteux pour des tailles importantes ou en l'absence de copie correcte (par exemple, si deep copy n'est pas implémenté).
void process(const std::string& s); // Ne copie pas void process(std::string s); // Copie
Histoire Dans une bibliothèque d'entreprise de structures mathématiques, un programmeur a décidé d'accélérer le fonctionnement en passant de grands conteneurs par valeur. Cela entraînait des frais généraux importants à chaque appel de fonction - les performances étaient réduites de moitié.
Histoire Dans le module de gestion des utilisateurs, des pointeurs étaient utilisés sans vérification sur
nullptr. Des plantages aléatoires se produisaient parfois en accédant à des pointeurs non valides, le débogage a duré des mois.
Histoire Dans un projet de traitement d'images, certaines fonctions prenaient des objets par valeur, d'autres par référence. Pour une des classes, le deep copy n'était pas implémenté, ce qui entraînait des fuites de mémoire et un ownership implicite des ressources après passage par valeur.