עבור לתוכן

מישהו מוכן בבקשה להסביר לי מתי אני משתמש בCONST במונחה עצמים בC++ ?

Featured Replies

פורסם

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

תודה מראש,

פורסם

כשאתה מגדיר משתנה או פרמטר כ-const זה אומר שהוא "קבוע". כלומר אתה לא יכול לשנות אותו, אם הוא class/struct אז אתה לא יכול לשנות את האיברים שלו, ואם יש לו מתודות אז אתה יכול להפעיל רק את אלו שמוגדרות גם כ-const.

צריך לשים const בחתימה של מתודה כשאתה רוצה להבטיח שהמתודה לא תשנה את התוכן של האובייקט.

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

פורסם
  • מחבר

תודה תותח !

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

כדאי להוסיף:

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

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

בדומה, פרמטרים - יכול להיות שהפונקציה עצמה משנה את האובייקט שאליו היא שייכת, אבל לא אמורה לשנות פרמטרים שמעבירים אליה - אז תצהיר עליהם כקבועים.

שים לב שצריך להזהר עם מצביעים וreferences. פה יש התנהגות קצת מבלבלת.

הנה קטע שלקחתי מפה:

 
Read it backwards...

int* - pointer to int
int const * - pointer to const int
int * const - const pointer to int
int const * const - const pointer to const int

Now the first const can be on either side of the type so:
const int * == int const *
const int * const == int const * const

If you want to go really crazy you can do things like this:
int ** - pointer to pointer to int
int ** const - a const pointer to a pointer to an int
int * const * - a pointer to a const pointer to an int
int const ** - a pointer to a pointer to a const int
int * const * const - a const pointer to a const pointer to an int

And my addition (gmorphus):
Let's look at the following declarations:

int * pi;
const int *pci; // pointer to a const int
int * const pic; // const pointer to a non-const int
const int * const pcic; // const pointer to a const int
int i; // regular int

*pi = 7; // change the value pointed to by pi - allowed
pi = &i; // change pi to point to a different location - allowed
*pci = 7; // will not compile!
pci = &i; // OK! the pointer is not constant
*pic = 7; // OK! pic is pointing to a non-const int
pic = &i; // will not compile! pointer is constant
*pcic = 7; // will not compile
pcic = &i; // will not compile

ארכיון

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

דיונים חדשים