לדלג לתוכן

Copy constructor

מתוך ויקיפדיה, האנציקלופדיה החופשית

בנאי העתקה - מתודה של מחלקה המופעלת בעת יצירת מופע של המחלקה כהעתקה (=שכפול) של נתוני מופע קיים. בשפת ++C (כמו גם שפות אחרות המאפשרות תכנות מונחה עצמים) באני העתקה הוא פונקציה בעלת שם זהה לשם המחלקה שבה היא מוגדרת.

מבחינים בין "העתקה רדודה" שמבוצעת על ידי בנאי ההעתקה, ה-copy constructor, האוטומטי של שפת התכנות (כלומר שלאחר שהתוכנית עוברת אינפרטציה, ההדרה, שלבי ההעתקה נהפכים שקופים ומבוצעים לפי שיקולי המערכת מבלי שלמתכנת יש אפשרות לשלוט ולבקר אותה) לבין "העתקה עמוקה", שכדי לחולל אותה נדרש המתכנת ליצור את בנאי ההעתקה בעצמו, בעיקר במקרה של מצביעים. העתקה עמוקה מטפלת בנתונים שאינם אמורים לעבור מעצם לעצם כפי שהם. הדוגמה הבולטת לכך היא כאמור מצביעים. אם נסתפק בהעתקה רדודה ונעתיק מצביע אחד מעצם לעצם, יעשו שני עצמים שימוש באותו מצביע. כל שינוי בעצם אחד שבו ישתנה תוכן כתובת הזיכרון המוצבעת (אך לא תשתנה כתובת הזיכרון עצמה) יגרור שינויים גם בעצם האחר. מצב כזה לרוב אינו רצוי.

בבנאי ההעתקה הקריאה היא כך שההתייחסות היא לקבוע (const) ולא למשתנה (כלומר: const vaule&) המבטיח, שלא ישונה המשתנה של העצם המועתק.

בC# .NET הדבר מבוצע על ידי פונקציית CLONE.

דוגמה למימוש בתכנות (++C)

class CPerson {
  int m_iAge;
  string m_szName;
  Person* m_pMother;
 
  public CPerson(const CPerson& p) {
   m_iAge=p.m_iAge;
   m_szName=p.m_szName;
   if (NULL != m_pMother) {
     delete(m_pMother);
     m_pMother = NULL;
   }
   if (NULL != p.m_pMother) {
     mother=new Person(p.m_pMother);
   }
  }
};

תבנית:נ