עבור לתוכן
  • צור חשבון
  • מי אנחנו?

    שלום אורח/ת!

     
    שים לב - על מנת להשתתף בקהילה שלנו, להגיב ולפתוח דיונים חדשים, עליך להצטרף כחבר רשום.

    החברים שלנו נהנים מיתרונות רבים, כולל היכולת להשתתף בדיונים, להנות מהגרלות ומבצעים לחברי האתר, ולקבל מידי שבוע את התכנים הבולטים שלנו ישירות במייל.

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

ronen062013

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

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?

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

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

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

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

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

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים
   c c1,c2;
    
    c2 = c1.set(1,1); 

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

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

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

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

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים
ציטוט של Jabberwock

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

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

 

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

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

תודה

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

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

 

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

c2 = c1.set(1,1);

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

 

 

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

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

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

שתף דיון


קישור ישיר להודעה
שתף באתרים אחרים

הצטרפ/י לדיון

בשלב זה תוכל/י להצטרף לדיון, ולאחר מכן להצטרף לקהילה שלנו. אם כבר יש לך חשבון אצלנו, אנא התחבר/י עכשיו על מנת להגיב תחת שם המשתמש שלך.
לתשומת לבך: התגובה תופיע לגולשים לאחר אישור של צוות הנהלת הפורומים.

אורח
הוסף תגובה

×   התוכן שהודבק הוא עם עיצוב.   הסר עיצוב

  Only 75 emoji are allowed.

×   הקישור שלך הוטמע אוטומטית.   הצג כקישור רגיל

×   התוכן הקודם שלך שוחזר אוטומטית.   נקה הכל

×   You cannot paste images directly. Upload or insert images from URL.


×
  • צור חדש...
Back to top button
Close
Close