עבור לתוכן

שפת c - שאלה על מצביע this

Featured Replies

פורסם
#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?

  • 2 שבועות מאוחר יותר...
פורסם
  • מחבר

מישהו?

 

פורסם

המצביע this הוא מצביע למופע המחלקה אבל כשעושים כוכבית לפני הוא מעתיק את המופע.

  • 2 שבועות מאוחר יותר...
פורסם
  • מחבר

אם הוא מעתיק את המופע אז למה הפונקציה שלו מחזירה &c ולא c?

פורסם

כאשר מחזירים משתנה ייחוס מאחורי הקלעים הוא מוחזר כמצביע, אין זה אומר שבפועל צריך להחזיר מצביע. לכן מבחינה תחבירית אופן השימוש הינו כלפי העצם עצמו.

מטרת הייחוס הינה לחסוך בשימוש של זיכרון מחסנית ולהשתמש יותר בזיכרון ערימה.

פורסם
   c c1,c2;
    
    c2 = c1.set(1,1); 

c2 הוא אובייקט נפרד ולכן למרות שהערך המוחזר אליו מהפונקציה set הוא רפרנס מתבצעת העתקה ודריסה של אובייקט c2.

על מנת ש-c2 יהיה רפרנס ל-c1 נדרש לשנות את הקוד:

    c c1;
    
    c& c2 = c1.set(1,1); 

שים לב שרפרנס חייב להיות מאותחל בהגדרתו.

  • 2 שבועות מאוחר יותר...
פורסם
  • מחבר
ציטוט של Jabberwock

כאשר מחזירים משתנה ייחוס מאחורי הקלעים הוא מוחזר כמצביע, אין זה אומר שבפועל צריך להחזיר מצביע. לכן מבחינה תחבירית אופן השימוש הינו כלפי העצם עצמו.

מטרת הייחוס הינה לחסוך בשימוש של זיכרון מחסנית ולהשתמש יותר בזיכרון ערימה.

 

1. אז למעשה הועתק עצם לזיכרון הערה ואז הוחזר אליו ייחוס? אם הבנתי נכון, אז למה לא צריך לשחרר זיכרון דינאמית? 

2. גם לא הבנתי: אם מוחזר משתנה ייחוס אז איך הוא משוכן בהצלחה ב c2 שהוא מופע רגיל ולא מצביע

תודה

פורסם

אני רואה שעשיתי בילבול. מה שרשמתי ב-6 לאוקטובר לא היה מדויק.

 

העתקה מתבצעת בדיוק פה:

c2 = c1.set(1,1);

c2 הינו מופע. הפונקציה set החזירה ייחוס. מופע יכול להעתיק משתנה ייחוס (העצם עצמו).

 

 

פורסם
  • מחבר

1. כלומר מופע יכול לקבל משתנה ייחוס ולמעשה הוא יצביע על ההעתק?

2. ואם אני רוצה מצביע לערך המוחזר? by ref? מה עלי להחזיר?

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים