C++ 函數重載 什麼是函數重載: 可以有多個同名的函數。 可以通過函數重載來設計一系列函數——他們完成相同的工作,但使用不同的參數列表。 函數特征標: 函數重載的關鍵是函數的參數列表——也稱為函數特征標。 如果兩個函數的參數數目和類型相同,同時參數的排列順序也相同,則它們的特征標相同,反之不同。 ...
C++ 函數重載
什麼是函數重載:
- 可以有多個同名的函數。
- 可以通過函數重載來設計一系列函數——他們完成相同的工作,但使用不同的參數列表。
函數特征標:
- 函數重載的關鍵是函數的參數列表——也稱為函數特征標。
- 如果兩個函數的參數數目和類型相同,同時參數的排列順序也相同,則它們的特征標相同,反之不同。
- C++ 允許定義名稱相同的函數,條件是它們的特征標不同。
註意事項:
- 編譯器根據所採取的用法使用有相應特征標的原型。
- 沒有匹配的原型時,C++ 將嘗試使用標準類型轉換強制進行匹配。
- 沒有匹配的原型又有多個可轉換的方式時 C++ 將拒絕這種函數調用,並將其視為錯誤。
- 一些看起來彼此不同的特征標是彼此不能共存的:
- 如:變數與引用
double cube(double x); double cube(double & x);
編譯器在檢查函數特征時,把類型引用和類型本身視為同一個特征標。
- 非 const 與 const 同時存在時匹配最佳,只有 const 存在時匹配函數時並不區分 const 和非 const 變數:
- 將非 const 值賦給 const 變數是合法的,但反之是非法的。
- 是特征標,而不是函數類型使得可以對函數進行重載。
重載引用參數:
1 void sink(double & r1); // matches modifiable lvalue 2 void sink(const double & r2); // matches modifiable or const lvalue, rvalue 3 void sink(double && r3); // matches rvalue
- 左值引用參數 r1 與可修改的左值參數(要求類型完全匹配)匹配。
- const 左值引用參數 r2 與可修改的左值參數、const 左值參數和右值參數匹配(考慮類型不匹配時匿名變數的生成)。
- 右值引用參數 r3 與右值匹配(似乎具有類似生成匿名變數的功能:double && 類型可接受 int 或 const int 類型的左右值實參)。
- 如果重載使用這三種函數,將調用最匹配的版本。
何時使用函數重載:
- 當函數執行基本上相同的任務,但使用不同形式的數據時。
- 有時使用帶預設參數的函數比編寫多個重載函數要簡單些。