2016-11-08 124 views
0

混淆例如,有3個文件,sum.h,sum.cppmain.cppC++ - 關於使用默認參數

sum.h -

... 
    int sum (int, int, int); 
    ... 

sum.cpp

... 
    int sum (int a, int b, int c=10) { 
     return a + b + c; 
    } 

main.cpp

... 
    cout << sum (1, 2) << endl; 
    ... 

編譯器會引發錯誤說too few arguments to function...

它工作正常,如果我編碼爲cout << sum (1,2,3) << endl; 但如何只傳遞只有2個參數?

+2

將默認參數放在標題中。 – drescherjm

回答

2

默認函數參數必須放在調用站點看到的函數聲明中。

int sum (int, int, int = 10); 

它們在調用函數的表達式中是必需的。實現不應該在乎它是否通過了默認值。

此外,您可以在更小的範圍內重新聲明函數,並給出完全不同的默認參數。這段代碼是從C++ 17標準草案中採取並展示了我的意思:

void f(int, int); 
void f(int, int = 7); 
void h() { 
    f(3);       // OK, calls f(3, 7) 
    void f(int = 1, int);   // error: does not use default 
           // from surrounding scope 
} 
void m() { 
    void f(int, int);    // has no defaults 
    f(4);       // error: wrong number of arguments 
    void f(int, int = 5);   // OK 
    f(4);       // OK, calls f(4, 5); 
    void f(int, int = 5);   // error: cannot redefine, even to 
           // same value 
} 
void n() { 
    f(6);       // OK, calls f(6, 7) 
} 

理論上(不這樣做,在實踐中),你甚至可以有一個聲明相同的功能,不同的頁眉不同默認參數值。只要它們不屬於同一翻譯單位,它將按預期工作。

+0

@Remy,如果您在將來提出編輯建議,我會很感激。我剛剛失去了一段我正在編輯的段落。 – StoryTeller

1

您必須指定在原型中的默認值(在.h文件中的函數定義):

int sum (int, int, int=10); 

無需在功能的實現來指定。