כמה הערות
מומלץ להגדיר את ה-reference עם const למניעת שינוי של ה-RHS (שזה ה-Right Hand Side) של המשוואה. למשל, קח את הקוד הבא:
class A { public: A(int i_n) : n(i_n) {} A(A &rhs) { n = rhs.n; rhs.n = 5; } private: int n; }; int main() { A a(10); A b = a; return 0; }
במקרה הנ"ל, בסוף התהליך, b.n יכיל 10 (שהיה הערך של a.n), ואילו a.n יכיל 5, כי שינינו אותו (בטעות, נניח) בתוך ה-Copy ctor של A. עדיף להגדיר את ה-Copy Ctor בצורה הבאה, שתמנע שינוי של ה-RHS:
... A(const A &rhs) {...} ...
שנית, Copy Ctor לא משמש להשמות - אלא ליצירת אובייקט חדש תוך התבססות על אובייקט קיים. למשל:
(1) A a = b; (2) A a(b); (3) A a; a = b
במקרים 1 ו-2 יופעל Copy constructor (אני מניח ש-b הוא מטיפוס A כמובן). במקרה 3 יופעל תחילה Default constructor, ולאחר מכן יופעל ה-Assignment operator, שאפשר להגדירו כך:
class A { ... A &operator =(const A &a); ... };
...מה שמביא אותי לנקודה האחרונה - אם הגדרת Copy Constructor, כנראה שאתה צריך גם Assignment operator. זה כמעט
תמיד נכון, ובכלל עדיף לעשות פונקציה אחת שקוראים לה משתי הפונקציות - מה-copy ctor ומה-assignment.