שאלה לגבי קוד מסוים

שאלה לגבי קוד מסוים

קוד:
1. class X {
2. public:
3. int x;
4. int *p;
5. X() : x(1), p(&x) {}
6. void g() const {
7. p = &x;
8. *p = 1;
9. }
10. };
נניח שנתון הקוד הנ"ל.
מדוע שורה 7 כן מתקמפלת ושורה 8 לא?
השיטה היא const וזה אומר שהאובייקט לא משתנה , אבל עדיין לא ברור לי..
 

BravoMan

Active member
אני לא יודע עם איזה כלי אתה מקמפל את הקוד הזה

אבל אין שום תקן של שפת ++C שבו שורה 7 אמורה להתקמפל.
&nbsp
אתה בטוח שקראת נכון את הודעת השגיאה?
 

BravoMan

Active member
אי אפשר להניח את זה, כי הקוד הזה לא יכול להתקמפל

לפי חוקי שפת ++C.
&nbsp
האם זו עוד שאלה מאותו מבחן כמו השאלה הקודמת?
אם כן, יש שתי אפשרויות:
&nbsp
1. נפלה טעות בשאלה.
2. נפלה טעות כשהעתקת את הקוד לפורום.
&nbsp
אתה מוזמן להכניס את הקוד הזה לקומפיילר ולהיווכח בעצמך.
&nbsp
היום יש אפילו קומפיילרים אונליין, שיחסכו לך התקנה של כלי פיתוח על המחשב.
 
אתה בטוח במה שאתה אומר?
הכנסתי את זה עכשיו לקומפיילר רק כדי להיות בטוח. שורה 7 לא מתקמפלת, שורה 8 כן.
&nbsp
הסיבה היא שהמתודה היא const, כלומר אסור לה לשנות שום איבר במחלקה, ולכן אסור לה לשנות את x או את p.
אבל שום דבר לא מונע ממנה לשנות את p*, שזה איזור הזיכרון ש p מצביע אליו. המצביע p מצביע אל איזור זיכרון מחוץ לאובייקט, ואותו מותר לשנות.
 
למעלה