C++/מחלקות: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Ybungalobill (שיחה | תרומות)
אין תקציר עריכה
Ybungalobill (שיחה | תרומות)
שורה 194:
== העתקת אובייקטים ==
 
בC++ ישנו בנאי אחד ואופרטור אחד המוגדרים כברירת מחדלאוטומטית עבור כל מחלקה. תפקיד הבנאי הזה הוא לאתחל את המופע החדש ע"י אובייקט קיים ואילו תפקיד האופרטוראופרטור ההשמה הזה הוא להעתיק את ערכו של אובייקט אחד לאובייקט שני. עבור טיפוס X כותרת הבנאי תהיה {{קוד בשורה|X::X(const X&)}} וכותרת האופרטור תהיה {{קוד בשורה|<nowiki>X& X::operator = (const X&)</nowiki>}} (על העמסת אופרטורים למד בהמשך). גם הבנאי וגם האופרטור, שניהם מעתיקים אחד אחד את משתני המבנה/המחלקה, דבר זה מאפשר לנו בקלות לכתוב כך:
<div style="direction: ltr;"><source lang="cpp">
Date myBirthday(18, 6, 1991);
שורה 202:
</source></div>
 
אומנם גישה זו לא תתאים למחלקת myString. הבעייה היא שהנתונים אותם מאחסנת המחלקה נמצאים מחוץ למחלקה עצמה, הם לא משתני המחלקה אלהאלא נמצאים בזיכרון דינאמי אליו אנו שומרים מצביע. כאשר נאתחל מופע של myString בשם a באמצעות מופע b ונשתמש בבנאי ברירת מחדל המוגדר בשפה, יהיה לנו אזור בזיכרון אליו יצביעו שני מצביעים. שינוי מחרוזת a יגרור לשינוי מחרוזת b ולהפך. יתר על כן, כאשר יושמדו שני המופעים יהיה ניסיון לשחרר את אותו הזיכרון פעמיים, דבר העלול לגרום לקריסת התוכנית. כדי למנוע דבר זה עלינו להגדיר לבד בנאי זה, כפי שנעשה בדוגמה שלמעלה.
 
כאשר נשתמש באופרטור ההשמה a = b המצב יהיה גרוע יותר: לאזור אחד בזיכרון, השייך במקור ל-b יצביעו שני מצביעים כמו במקרה הקודם, ובנוסף יהיה לנו אזור שני, השייך במקור ל-a, אליו לא יהיה מצביע כלל. אזור זה לא ישוחרר. נציץ טיפה קדימה לנושא העמסת אופרטורים ונדגים כיצד להגדיר אופרטור השמה למחלקה שלנו, בדוגמה זו נשתמש במצביע this כדי לחשוף את המקרים בהם אנו משימים את המשתנה לעצמו (a = a):