aze (./235) :
void swap(int &a, int &b)
void swap(int &a, int &b)
{
int &c = a;
a = b;
b = c;
}
Ce code est faux,
c doit être une valeur, pas une référence, sinon ton swap ne marche pas.
Brunni (./237) :
Franchement plus je lis tes questions plus je me dis que tu devrais plutôt te mettre au Java pour commencer la POO pure.
Langage beaucoup moins flexible et plus contraignant.
Déjà en Java tu ne passes pas les paramètres par référence, mais toujours par valeur, ce qui te garantit l'absence d'effet de bord comme celui de ta fonction Fibonacci.
Sauf que…
Ensuite les objets sont toujours des références
… et que donc on peut en avoir plein, d'effets de bord. Il suffit d'ailleurs d'utiliser un
int[] ou un
Integer boxé pour passer un
int par référence.
// En C++, objet implicitement partagé
Objet o;
et tu as tous les avantages: c'est une référence, mais si tu modifies l'objet, c'est comme si c'était une copie (la copie est créée à la modification), donc pas de méchants effets de bord. Et les données pointées sont détruites automatiquement au bon moment (quand le compteur de références atteint 0). Toute la logique est dans la classe. (Il faut évidemment coder la classe de la sorte, mais on peut utiliser par exemple
QSharedData et
QSharedDataPointer pour obtenir l'effet voulu sans coder toute la logique soi-même.)
Cf.
http://doc.qt.nokia.com/4.6/implicit-sharing.html.
En C# les références se font avec le mot clé ref et on les utilise rarement, en Java elles n'existent pas. Donc c'est pour ça que ça ne sert à rien de trop chercher à les utiliser, car ça ne te sera pas vraiment utile pour la suite 
Tu sous-entends qu'il compte passer à ces langages moins performants et moins flexibles plus tard, pourquoi?

Brunni (./250) :
C'est pour ça que dans les getters tu fais normalement toujours des .Clone()

Vive le partage implicit!
et finalement les objets utilisés comme des enregistrements sont immuables.
Et bonjour les
Vector::append qui recopient tout le vecteur à chaque fois (et retournent une copie qu'il faut assigner explicitement).

C'est tellement plus pratique quand l'objet de données (ce que tu appelles "enregistrement", mais ça peut être un objet beaucoup plus intelligent qu'une structure et avoir des méthodes; pour Qt, un objet de données est tout ce qui n'est pas un
QObject, c'est-à-dire tout ce qui ne produit ni ne consomme des évènements) se comporte comme une copie librement modifiable, mais n'est effectivement recopié que quand c'est vraiment nécessaire. Copy on write FTW!