• <span id="qootd"></span>
      1. <track id="qootd"></track><acronym id="qootd"></acronym>

        參數的缺省值在C++中參數可以設置缺省值,設置了缺省值之后,這個參數在調用時可以省略。

        注意:設置缺省值的參數只能是最后的幾個參數。也就是說某一個參數一旦設置了缺省值,其后而的參數也必須設置缺省值。例如:f()函數有3個參數,如果只設置第2個有缺省值,這就錯了。因為調用時只輸入2個參數時,系統不知道究竟是第2個參數還是第3個參數。

        參數缺省值舉例:

        1. #include <iostream>
        2. using namespace std;
        3.  
        4. int sum(int x=0, int y=100, int z=0) { return x+y+z; }
        5. //int sum(int x, int y=100, int z=0) { ... } //這是正確的
        6. //int sum(int x, int y, int z=0) { ... } //這也是正確的
        7. //int plus(int x, int y=100, int z) { ... } //這是錯誤的
        8.  
        9. int main ( )
        10. {
        11. cout << sum() << endl;
        12. cout << sum(6) << endl;
        13. cout << sum(6, 10) << endl;
        14. cout << sum(6, 10, 20) << endl;
        15.  
        16. return 0;
        17. }

        運行結果:
        100
        106
        16
        36

        函數的重載

        函數的重載在C++中具有重要作用,重載(overload)不要和后面要學的覆蓋(override)混淆起來。重載是指相同的函數名,但參數的類型或個數中只要有所不同,便進行再定義,編譯之后重載的函數都具有不同的地址,也就是說雖然函數名相同,實際上是不同的函數,在調用時,編譯系統會根據不同之處自動區別是調用哪一個函數。對于普通函數和后面要學的類的成員函數都適用。

        覆蓋只對類的構造函數或成員函數適用,是子類繼承父類是才使用的非常有用的功能。重載可以針對運算符,而覆蓋不行。上一節中缺省值的設置,實際上在編譯時等價于重載,被生成了4個不同的函數。

        早期的C++版本,在定義重載函數時要加上關鍵字overload,現在不用了。在使用重載函數時,如果有類型的自動轉換時要特別注意,初學者往往出錯在這兒。

        函數重載舉例:

        1. #include <iostream>
        2. using namespace std;
        3.  
        4. float fun(float x);
        5. double fun(double x);
        6.  
        7. int main ( )
        8. {
        9. float f = 132.64;
        10. double d = 132.64;
        11.  
        12. cout << fun(f) << endl;
        13. cout << fun(d) << endl;
        14. //cout << fun(5) << endl; //編譯錯,參數5可以轉換為float,也可轉換為double
        15.  
        16. return 0;
        17. }
        18.  
        19. float fun(float x)
        20. {
        21. return x / 2.0 ;
        22. }
        23.  
        24. double fun(double x)
        25. {
        26. return x / 3.0;
        27. }

        運行結果:
        66.32
        44.2133

        設計時的重載錯誤

        上面的例子中,設計時并沒有問題,調用時類型自動轉換時發生了二義性。下面列舉的重載函數是設計時就出了問題,兩個函數本身就具有重復的意義。

        1.  #include <iostream>
        2. using namespace std;
        3.  
        4. int fun(int a, int b);
        5. int fun(int a, int &b);
        6.  
        7. int main ( )
        8. {
        9. int x=1, y=2;
        10. cout << fun(x, y) << endl; //這句編譯時出錯
        11.  
        12. return 0;
        13. }
        14.  
        15. int fun(int a, int b);
        16. {
        17. return a + b;
        18. }
        19.  
        20. int fun(int a, int& b);
        21. {
        22. return a - b;
        23. }

        上面例子用到了int&,這叫“引用”,關于什么是“引用”參見下一章。

        重載函數的地址

        這里使用函數指針來取得函數的地址,有關函數指針已經在C語言教程中介紹,

        1. #include <iostream>
        2. using namespace std;
        3.  
        4. void space(int count);
        5. void space(int count, char ch);
        6.  
        7. int main ( )
        8. {
        9. //有一個整型參數的函數指針
        10. void (*fp1)(int);
        11.  
        12. //有一個整型參數、一個字符型參數的函數指針
        13. void (*fp2)(int, char);
        14.  
        15. fp1 = space; //取space(int)函數的地址
        16. fp2 = space; //取space(int, char)函數的地址
        17.  
        18. fp1(20); //輸出20個空格
        19. cout << "|" << endl;
        20. fp2(20, '='); //輸出20個等號
        21. cout << "|" << endl;
        22.  
        23. return 0;
        24. }
        25.  
        26. //輸出count個空格字符
        27. void space(int count)
        28. {
        29. for ( ; count; count--) cout << ' ';
        30. }
        31.  
        32. //輸出count個ch字符
        33. void space(int count, char ch)
        34. {
        35. for ( ; count; count--) cout << ch;
        36. }

        輸出結果:

        免責聲明:本文僅代表作者個人觀點,著作權歸作者所有。其原創性以及文中陳述文字和內容(包括圖片、視頻、附件等)未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請用戶僅作參考,并請自行核實相關內容。轉載作品務請注明出處,機構云平臺、個人云空間的建設權、管理權、所有權均歸實名機構和實名師生所有,與世界大學城無關。
        標簽:C++缺省參數和函數重載
        還能輸入 2000 個html字符
        色偷偷