Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

תיכנות בלינוקס - שאלה על const-reference ב-C++

Anonymous - 27/11/2017 - 10:39
נושא ההודעה: שאלה על const-reference ב-C++
כבר שנים לא כתבתי ב-C++, אבל נתקלתי היום בנושא הזה ואני מנסה להבין.
מה בדיוק מותר ומה אסור לעשות כשמעבירים const reference?

לדוגמה - יש לי מחלקה Foo, ובמקום אחר פונקציה המוגדרת:

קוד:


void bar (const Foo &f) {}



מובן שאסור לי בתוך הפונקציה bar להציב ערך חדש למשתנה f (דבר שישנה את המצביע גם מחוץ לפונקציה, היות והעברתי by reference). אבל האם יש מגבלה על קריאות לפונקציות על f?
נאמר ויש לי פונקציות שמשנות את המצב הפנימי של Foo, כמו למשל setBaz - האם אוכל לקרוא להן מתוך bar?
או שמא קריאה לפונקציות על Foo מוגבלת רק לפונקציות שמוגדרות const ב-Foo? (ועל כן, אם אני מבין נכון, אסור להן לשנות שדות של Foo...)

בנוסף - האם יש מגבלות על מתודות אחרות שמותר לי לקרוא להן? מניח שאסור לי לקרוא למתודות שמקבלות Foo by reference אבל לא const, כן?

תודה.
Anonymous - 27/11/2017 - 11:28
נושא ההודעה:
אז אחרי עוד הרבה חיפושים מצאתי עמוד שמסביר את זה:

https://isocpp.org/wiki/faq/const-correctness

(מרמור: למה כל כך קשה למצוא תיעוד ברור על C++? רוב העמודים שמצאתי הכילו מידע כל כך חלקי שאפילו אם כבר הייתי יודע את זה היה קשה לי להבין מה הם אומרים).

תשובה למי שמתעצל לקרוא: כן, const מונע ממך לשנות מצב פנימי של האובייקט, וזו שגיאת קומפילציה לקרוא על ארגומנט שהועבר by const reference לפונקציה שלא הוגדרה const או שלא מקבלת אותו כ-const (אם בכלל מקבלת reference).
Anonymous - 27/11/2017 - 18:30
נושא ההודעה:
SF :
אז אחרי עוד הרבה חיפושים מצאתי עמוד שמסביר את זה:

https://isocpp.org/wiki/faq/const-correctness

(מרמור: למה כל כך קשה למצוא תיעוד ברור על C++? רוב העמודים שמצאתי הכילו מידע כל כך חלקי שאפילו אם כבר הייתי יודע את זה היה קשה לי להבין מה הם אומרים).

תשובה למי שמתעצל לקרוא: כן, const מונע ממך לשנות מצב פנימי של האובייקט, וזו שגיאת קומפילציה לקרוא על ארגומנט שהועבר by const reference לפונקציה שלא הוגדרה const או שלא מקבלת אותו כ-const (אם בכלל מקבלת reference).


אם להיות קצת cucu אפשר לעשות :

קוד:

void bar (const Foo & F )
{
Foo * ptr = (Foo * ) &F; //or static_cast it is irrelevent for this example
ptr->field = 1;
}


כל נושא ה const correctness זה המלצה בלבד.
elcuco - 27/11/2017 - 23:24
נושא ההודעה:
אתה תמיד יכול לעשות:

קוד:

char *self = (char*) this;
self[12] = 2;


כי, מה זה משנה, אני יודע מההיסט של השדה הזה בכל זאת... צריך לנסות לעבוד עם השפה ולא להילחם איתה.
borsood - 28/11/2017 - 10:11
נושא ההודעה:
SF :
אז אחרי עוד הרבה חיפושים מצאתי עמוד שמסביר את זה:

https://isocpp.org/wiki/faq/const-correctness

(מרמור: למה כל כך קשה למצוא תיעוד ברור על C++? רוב העמודים שמצאתי הכילו מידע כל כך חלקי שאפילו אם כבר הייתי יודע את זה היה קשה לי להבין מה הם אומרים).

תשובה למי שמתעצל לקרוא: כן, const מונע ממך לשנות מצב פנימי של האובייקט, וזו שגיאת קומפילציה לקרוא על ארגומנט שהועבר by const reference לפונקציה שלא הוגדרה const או שלא מקבלת אותו כ-const (אם בכלל מקבלת reference).

isocpp הוא כן העמוד הרשמי של השפה. להבדיל ממה שהאורח כתב const correctnes זה כן דבר חשוב ויש לו השפעה משמעותית גם על הנכונות של הקוד וגם על הביצועים.
תיעוד מעולה על cpp תמצא באתר cppreference,org. הבעייה היא שכיוון שהתיאור שם מדוייק הוא לא תמיד ברור במיוחד חא למתחילים.
cplusplus.com הוא גם אתר טוב , ברור יותר אבל יש בו כמה אי־דיוקים.
כל הזמנים הם GMT + 2 שעות