לדלג לתוכן

Copy constructor

מתוך ויקיפדיה, האנציקלופדיה החופשית
גרסה מ־16:59, 22 ביוני 2007 מאת Tauruso (שיחה | תרומות) (תוקנה הפונקציה)

בנאי ההעתקה - סוג של פונקציה בתכנות מונחה עצמים שבשפת ++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);
      }
   }
};

תבנית:נ