C++函數(shù)參數(shù)匹配規(guī)則示例小結
C++ 函數(shù)參數(shù)匹配
1 單個參數(shù)匹配
void f(); //f1
void f(int); //f2
void f(int, int); //f3
void f(double, double=3.14);//f4
int main() {
f(5.6); //調用f4
return 0;
}candidate functions:函數(shù)名稱相同(f1, f2, f3, f4 都是)。
viable functions:參數(shù)個數(shù)相同(排除f1, f3),且參數(shù)可以轉換成相同類型(f2, f4都是viable function)。如果不存在viable functions,則編譯器報參數(shù)不匹配錯誤(可以通過linting檢查)。 最后決定參數(shù)類型是否匹配,如果匹配優(yōu)先調用,不能則選擇可以隱式轉換成類型相同的函數(shù)。
2 多個參數(shù)匹配
void f(); //f1
void f(int); //f2
void f(int, int); //f3
void f(double, double=3.14);//f4
int main() {
f(42, 5.6); //報錯,參數(shù)模糊
return 0;
}condidate functions: f1, f2, f3, f4
viable functions: f3, f4
優(yōu)先級: 精確匹配的參數(shù)個數(shù)越多優(yōu)先級越高,參數(shù)個數(shù)相同優(yōu)先級相同,如果存在多個最高優(yōu)先級的函數(shù),則報參數(shù)模糊錯誤。
參數(shù)類型轉換
優(yōu)先級:
- 精確匹配:包括類型相同, 數(shù)組和參數(shù)名轉換為指針,忽略頂層const
- const 轉換 (把非const實參傳給const形參)
- promotion數(shù)據(jù)提升,如int->long, char->unsigned等
- 算術轉換或者指針類型轉換
- 類類型(class-type)轉換,如string->bool
Promotion and Arithmetic Conversion
void ff(int); //f1
void ff(short); //f2
void manip(long); //f3
void manip(float); //f4
int main() {
ff('a'); //調用f1,char -> int是promotionO(比int短的數(shù)據(jù)類型統(tǒng)一promotion為int,
// char->short 是算術轉換
manip(3.14); //error: ambiguous call,3.14視為double,double->float和doule->long在優(yōu)先級上是等價的
return 0;
}const Arguments
忽略頂層const, 原因是傳參的時候實際上進行的是copy過程,即copy一份實參給形參,copy會忽略頂層const
void f(int a); void f(const int a);//報錯,重復定義,兩者只能定義一種 void f(int *a); void f(int* const a);//報錯,重復定義,兩者只能定義一種
const 轉換
void f(int &); //f1
void f(const int &);//f2
int main() {
const int a{0};
int b{0};
f(a); //調用f2(精確匹配)
f(b); //調用f1(沒有定義f1時,調用f2)
return 0;
}另外,
void f(int);
void f(int &);
int main() {
int i = 0;
f(i); //報錯,ambiguous call
return 0;
}到此這篇關于C++函數(shù)參數(shù)匹配規(guī)則的文章就介紹到這了,更多相關C++函數(shù)參數(shù)匹配內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)LeetCode(12.整數(shù)轉化成羅馬數(shù)字)
這篇文章主要介紹了C++實現(xiàn)LeetCode(12.整數(shù)轉化成羅馬數(shù)字),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07

