ו... כמה מילים על optional/default parameters.
אפשר לקבוע ערכי default לפרמטרים של פונקציה. כאשר קוראים לפונקציה, אפשר להשמיט את הפרמטר, ובמקומו יוכנס ערך ה-default.
זה נכון לגבי כל פונקציה, ו-constructor בפרט.
איך נראית הפונקציה עם default parameters? היא נראית כך:
ה-prototype:
void func_def(int a, int b=5);
ההגדרה:
void func_def(int a, int b=5){
...
}
הערות:
- אפשר להגדיר את כל הפרמטרים של פונקציה כ-optional או רק את חלקם.
-בכל מקרה, רשימת הפרמטרים האופציונלים מתחילה מימין, והיא תמיד רציפה, כך שהדוגמא הבאה מראה מצב אסור:
void func_def(int a, int b=5, int c); // not correct!
אז הנה דוגמא ל-optional parameter במימוש של constructor.
בדוגמא הבאה ה-constructor מקבל שני פרמטרים, a ו-b. הפרמטר b הוא optional (שורה 16).
אם משמיטים אותו, b יקבל את הערך 5 כברירת מחדל.
אם משמיטים אותו, b יקבל את הערך 5 כברירת מחדל.
שורה 22: קריאה ל-constructor עם שני פרמטרים.
שורה 24: קריאה ל-constructor עם פרמטר אחד. b מקבל את הערך 5.
בהמשך נתייחס לאפשרות התנגשות בין default parameters ל-overloading.
בהמשך נתייחס לאפשרות התנגשות בין default parameters ל-overloading.
- /*
- * optional.cpp
- *
- * Created on: Mar 18, 2012
- * Author: ronen halevy
- */
- #include <iostream>
- using namespace std;
- class Example {
- private:
- int a;
- int b;
- public:
- Example(int a, int b=5){ Example::a = a; Example::b = b;}
- void show(){cout << "a="<< Example::a << endl << "b="<< Example::b << endl;}
- };
- int main(){
- Example ex1(10, 20);
- ex1.show();
- Example ex2 = Example(10);
- ex2.show();
- }[
והנה הפלט:
a=10
b=20
a=10
b=5
ועכשיו בנוגע לקונפליקט אפשרי בין default parameters ל-overloading.
בהמשך לדוגמא שלמעלה, נניח שמוגדרים שני constructors עם overloading:
Example(int a, int b=5){ Example::a = a; Example::b = b;}
Example(int a){ Example::a = a; Example::b = 6;}
Example(int a){ Example::a = a; Example::b = 6;}
במקרה של:
Example ex(4);
איזה מה-constructors יופעל? התשובה - תתקבל שגיאה:
error: call of overloaded ‘Example(int)’ is ambiguous
אין תגובות:
הוסף רשומת תגובה