שפת c - שאלה על מצביע this - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


ronen062013

Recommended Posts

#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 שבועות מאוחר יותר...
  • 2 שבועות מאוחר יותר...

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

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

קישור לתוכן
שתף באתרים אחרים

   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 החזירה ייחוס. מופע יכול להעתיק משתנה ייחוס (העצם עצמו).

 

 

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...