C++函式過載及原理
阿新 • • 發佈:2018-12-10
函式過載
函式過載是指在同一名稱空間,可以宣告功能相似的同名函式, 但是這些同名函式的形式引數(引數的數量,型別,順序)必須不同, 函式的返回值不影響,可以相同也可以不同
C++函式過載的原理
函式過載是因為c++的函式符號命名規則 下面以g++的編譯方式為例 在linux下可以通過objdump -d 檢視反彙編程式碼
int test_func(int a)
{
return a;
}
void func(int a, int b)
{
return;
}
void func(float a, float b)
{
return;
}
反彙編後
int test_func(int a) —->_Z9test_funci void func(int a, int b) —->_Z4funcii void func(float a, float b) —->_Z4funcff
可以看到函式符號的命名和函式的名稱函式的引數列表均有關, 即當引數列表中形參的型別數量和順序不同時,函式符號
就會發生改變從而實現過載
另外函式呼叫時會先進行匹配, 根據過載函式呼叫匹配規則進行匹配,當匹配到多個或沒有找到時會報錯
精確匹配:引數匹配而不做轉換,或者只是做微不足道的轉換,如陣列名到指標、函式名到指向函式的指標、T到const T; 提升匹配:即整數提升(如bool 到 int、char到int、short 到int),float到double 使用標準轉換匹配:如int 到double、double到int、double到long double、Derived*到Base*、T*到void*、 int到unsigned int; 使用使用者自定義匹配; 使用省略號匹配:類似printf中省略號引數
函式過載的好處
- 函式過載可以減少函式名的數量,避免了名稱空間的汙染,增加程式碼可讀性
- 運算子的過載也是函式過載,同樣可以增加程式碼的可讀性
- 類的多種建構函式實現
最後看一個關於const的 1. const修飾非指標型別
void test(const char a)
{
std::cout << "void test(const int a)";
}
void test(char a)
{
std::cout << "void test(int a)";
}
test重定義不等過載
const修飾指標型別
void test(const char a)
{
std::cout << "void test(const int a)";
}
void test(const char * a)
{
std::cout << "test const";
}
void test(char * a)
{
std::cout << "test";
}
const修飾指標型別可以過載 另外 int * const a 也不能用於過載, 此時const修飾的是a指標本身。