קבועים
בהכרזה על משתנה ניתן להוסיף לשם הטיפוס את המילה השמורה וזה גורם לכך שלא ניתן לשנות את ערכו במהלך כל התוכנית.
const int n = 5;
n = 7; // ERROR: assignment to read-only variable 'n'
const int m;
נכונות השימוש במשתנים קבועים נאכפת ע"י המהדר.
כאשר מוסיפים להגדרת מצביע ייתכנו מספר אפשרויות:
- הכתובת נשמרת במצביע קבועה
- הערך הנשמר במשתנה המוצבע קבוע
אם ה- מופיע כרישא לשם הטיפוס הוא מייחס לטיפוס ולא למצביע אליו. אם ה- מופיע בכל מקום אחר, אזי הוא מתייחס למי שמשמאלו.
const int* cptr: // pointer to const int
int const* cptr2; // pointer to const int
int* const ptr = nullptr; // const pointer to int
const int* const ptr = nullptr; // const pointer to const int
ניתן להמיר מצביעים לקבועים רק כאשר ההמרה היא מחמירה. כלומר:
- להמיר כתובת לא קבועה לכתובת קבועה
- להמיר מצביע לערך לא קבוע, למצביע לערך קבוע
העמסת פונקציות
ב- פונקציה מזוהה ע"י שמה ומספר וסוג הפרמטרים שלה.
מבחינת הפונקציות: void print(int) ו-void print(double) שונות.
ניתן להצהיר על מספר פונקציות בעלות אותו השם אך עם פונקציונליות שונה.
המהדר יבחר את הפונקציה הכי מתאימה לפי הארגומנטים בקריאה לה.
void print(int);
void print(double);
void print(const char* );
print(5); // print(int) called
print(3.14); // print(double) called
print("Hello"); // print(const char*)
המהדר מחפש פונקציה בעלת שם מתאים המקבלת את מספר הפרמטרים המתאים.
מבין כל הפונקציות הללו ההתאמה היא לפי הדירוג הבא:
- התאמה מדויקת או המרה טריוויאלית(, )
- התאמה בעזרת המרת קידום( וכו')
- התאמה בעזרת המרה לא מדויקת()
- התאמה בעזרת המרות שהוגדרו מראש ע"י המשתמש
אם קיימות שתי התאמות באותה רמה אז הקריאה מכילה דו-משמעות והיא לא תתקמפל.
בחירת הפונקציות אינה תלויה בערך ההחזרה ולא ניתן לכתוב שתי פונקציות השונות רק בערך ההחזרה שלהן.
ערכי ברירת מחדל
כאשר יש לנו פונקציות אשר להן הגיוני שאחד הערכים יהיה ערך מסויים ברוב הפעמים אזי נוכל להגדיר ערך ברירת מחדל כך:
void print(int n, int base = 10);
print(6, 10);
print(6); // same as above
ניתן לתת ערך ברירת מחדל רק לפרמטרים האחרונים של הפונקציה.
את ערך ברירת המחדל יש לכתוב פעם החת בלבד בהכרזת הפונקציה.