חזור לתיקייה: תרגול

5 - קבועים, העמסת פונקציות ומחלקות

חיפוש בתיקיה
Ctrl K
לחץ כאן או הקש Ctrl K כדי לחפש בכל התיקיה
  • קבועים
  • העמסת פונקציות
  • ערכי ברירת מחדל

5 - קבועים, העמסת פונקציות ומחלקות

02340124

מבוא לתכנות מערכות

רשימות תרגול לקריאה בשבת

קבועים, העמסת פונקציות ומחלקות

הופק מתוך תקיית התואר של שקד

uni-folder.vercel.app

קבועים

בהכרזה על משתנה ניתן להוסיף לשם הטיפוס את המילה השמורה constconstconst וזה גורם לכך שלא ניתן לשנות את ערכו במהלך כל התוכנית.

const int n = 5;
n = 7; // ERROR: assignment to read-only variable 'n'
const int m;

נכונות השימוש במשתנים קבועים נאכפת ע"י המהדר.

כאשר מוסיפים constconstconst להגדרת מצביע ייתכנו מספר אפשרויות:

  • הכתובת נשמרת במצביע קבועה
  • הערך הנשמר במשתנה המוצבע קבוע

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

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

ניתן להמיר מצביעים לקבועים רק כאשר ההמרה היא מחמירה. כלומר:

  • להמיר כתובת לא קבועה לכתובת קבועה
  • להמיר מצביע לערך לא קבוע, למצביע לערך קבוע

העמסת פונקציות

ב-C++C++C++ פונקציה מזוהה ע"י שמה ומספר וסוג הפרמטרים שלה.
מבחינת C++C++C++ הפונקציות: 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*)

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

  1. התאמה מדויקת או המרה טריוויאלית(T  ⟹  const  TT\implies const\; TT⟹constT, T  ⟹  &TT\implies \&TT⟹&T)
  2. התאמה בעזרת המרת קידום(double  ⟸  float  ,int  ⟸  char  ,int  ⟸  booldouble\impliedby float\;,int \impliedby char\;,int \impliedby booldouble⟸float,int⟸char,int⟸bool וכו')
  3. התאמה בעזרת המרה לא מדויקת(void∗  ⟸  T∗,    int  ⟸  dobule,    double  ⟸  intvoid^* \impliedby T^*,\;\;int \impliedby dobule,\;\; double \impliedby intvoid∗⟸T∗,int⟸dobule,double⟸int)
  4. התאמה בעזרת המרות שהוגדרו מראש ע"י המשתמש

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

ערכי ברירת מחדל

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

void print(int n, int base = 10);

print(6, 10);
print(6); // same as above

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