יום שני

Default Parameters


ו... כמה מילים על 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 כברירת מחדל.
שורה 22: קריאה ל-constructor עם שני פרמטרים.
שורה 24: קריאה ל-constructor עם פרמטר אחד. b מקבל את הערך 5.
בהמשך נתייחס לאפשרות התנגשות בין default parameters ל-overloading.


  1. /*
  2.  * optional.cpp
  3.  *
  4.  *  Created on: Mar 18, 2012
  5.  *      Author: ronen halevy
  6.  */


  7. #include <iostream>
  8. using namespace std;
  9. class Example {
  10. private:
  11. int a;
  12. int b;
  13.  public:
  14.    Example(int a, int b=5){ Example::a = a; Example::b = b;}
  15.    void show(){cout << "a="<< Example::a << endl << "b="<< Example::b << endl;}
  16.  };

  17.  int main(){

  18.  Example ex1(10, 20);
  19.  ex1.show();
  20.  Example ex2 = Example(10);
  21.  ex2.show();

  22.  }[

והנה הפלט:

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 ex(4);
איזה מה-constructors יופעל? התשובה - תתקבל שגיאה:
error: call of overloaded ‘Example(int)’ is ambiguous


אין תגובות:

הוסף רשומת תגובה