1. 程式人生 > >C++函式過載及原理

C++函式過載及原理

函式過載

函式過載是指在同一名稱空間,可以宣告功能相似的同名函式, 但是這些同名函式的形式引數(引數的數量,型別,順序)必須不同, 函式的返回值不影響,可以相同也可以不同

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中省略號引數 

函式過載的好處

  1. 函式過載可以減少函式名的數量,避免了名稱空間的汙染,增加程式碼可讀性
  2. 運算子的過載也是函式過載,同樣可以增加程式碼的可讀性
  3. 類的多種建構函式實現

最後看一個關於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指標本身。