פורסם 2019 בספטמבר 266 שנים #include <iostream> using namespace std; class c { public: int x,y; c& set(int xx,int yy) { x = xx; y=yy; return *this; } }; int main() { c c1,c2; c2 = c1.set(1,1); //איך סי2 מצליח לקבל מצביע ולמה זה העתקה ולא רפרנס? //c2 = &c1; //כאן יש שגיאה וזה מובן כי סי2 הוא לא מצביע c1.set(3,3); cout<<c2.x<<c2.y<<endl; //הוכחה שסי2 הוא העתק ולא רפרנס לסי1 return 0; } סי2 הוא מקבל את המצביע this למרות שסי2 לא מסוג מצביע. איך זה עובד ולמה זה מבצע העתקה ולא רפרנס לסי1?
פורסם 2019 באוקטובר 66 שנים המצביע this הוא מצביע למופע המחלקה אבל כשעושים כוכבית לפני הוא מעתיק את המופע.
פורסם 2019 באוקטובר 176 שנים כאשר מחזירים משתנה ייחוס מאחורי הקלעים הוא מוחזר כמצביע, אין זה אומר שבפועל צריך להחזיר מצביע. לכן מבחינה תחבירית אופן השימוש הינו כלפי העצם עצמו. מטרת הייחוס הינה לחסוך בשימוש של זיכרון מחסנית ולהשתמש יותר בזיכרון ערימה.
פורסם 2019 באוקטובר 176 שנים c c1,c2; c2 = c1.set(1,1); c2 הוא אובייקט נפרד ולכן למרות שהערך המוחזר אליו מהפונקציה set הוא רפרנס מתבצעת העתקה ודריסה של אובייקט c2. על מנת ש-c2 יהיה רפרנס ל-c1 נדרש לשנות את הקוד: c c1; c& c2 = c1.set(1,1); שים לב שרפרנס חייב להיות מאותחל בהגדרתו.
פורסם 2019 באוקטובר 286 שנים מחבר ציטוט של Jabberwock כאשר מחזירים משתנה ייחוס מאחורי הקלעים הוא מוחזר כמצביע, אין זה אומר שבפועל צריך להחזיר מצביע. לכן מבחינה תחבירית אופן השימוש הינו כלפי העצם עצמו. מטרת הייחוס הינה לחסוך בשימוש של זיכרון מחסנית ולהשתמש יותר בזיכרון ערימה. 1. אז למעשה הועתק עצם לזיכרון הערה ואז הוחזר אליו ייחוס? אם הבנתי נכון, אז למה לא צריך לשחרר זיכרון דינאמית? 2. גם לא הבנתי: אם מוחזר משתנה ייחוס אז איך הוא משוכן בהצלחה ב c2 שהוא מופע רגיל ולא מצביע תודה
פורסם 2019 באוקטובר 286 שנים אני רואה שעשיתי בילבול. מה שרשמתי ב-6 לאוקטובר לא היה מדויק. העתקה מתבצעת בדיוק פה: c2 = c1.set(1,1); c2 הינו מופע. הפונקציה set החזירה ייחוס. מופע יכול להעתיק משתנה ייחוס (העצם עצמו).
פורסם 2019 באוקטובר 286 שנים מחבר 1. כלומר מופע יכול לקבל משתנה ייחוס ולמעשה הוא יצביע על ההעתק? 2. ואם אני רוצה מצביע לערך המוחזר? by ref? מה עלי להחזיר?
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.