14-10-2006, 21:23
|
|
|
|
חבר מתאריך: 05.08.06
הודעות: 2,860
|
|
מה שכתבת בכלל לא נכון
זה נשמע כאילו כשהסבירו לך מה זה לא הקשבת טוב...
copy constructor נקרא רק בשלוש מקרים אם אינ זוכר טוב:
-כשאובייקט מאותחל עם אובייקט אחר...למשל:
קוד PHP:
obj_type obj=other_obj_of_class_obj_type; obj_type obj(other_obj_of_class_obj_type);
-כשפונקציה מחזירה אובייקט:
קוד PHP:
obj_type f() { .... return(obj_of_class_obj_type); }
-כשפונקציה מקבלת כפרמטר אובייקט:
*בשלושת המקרים מדובר על אובייקטים...לא על מצביעים ולא על .references
בדרך כלל אפשר להסתדר בלי copy constructor. כשלא מוגדר copy constructor על ידי המשתמש, ברירת המחדל של רוב המהדרים היא להציב את הערך (לא את המצביע) של כל חבר באובייקט( member )ל member התואם באובייקט השני.
הבעיה נוצרת כאשר יש לאובייקט members שהם מצביעים. כי כמו שאמרתי, המהדר מציב את הערך של המצביע, ולהבדל ממשתנים רגילים, הערך של מצביע הוא הכתובת אליה הוא מצביע. אז יוצא ששאותו ה member בשני אובייקטים שונים מצביע לאותו מקום, ואז יכולים להיות כל מיני קונפליקטים בהמשך, למשל כאשר distructor של אחד האובייקטים ישחרר את כתובת שבמצביע, ואחר כך הdistructor של האובייקט השני ינסה לעשות אותו דבר ותהיה שגיאה....
מה שתיארת בכלל לא קשור ל copy constructor...הוא לא ייקרא עבור הפעולה הזאת...יקרא האופרטור = ...כדי לעשות מה שרצית פשוט עושים:
|