關於C語言與C 中函式過載問題

2021-08-16 16:51:12 字數 2325 閱讀 2564

1.函式過載定義

函式過載:函式過載是指在同一作用域內,可以有一組具有相同函式名,不同引數列表的函式,這組函式被稱為過載函式。過載函式通常用來命名一組功能相似的函式,這樣做減少了函式名的數量,避免了名字空間的汙染,對於程式的可讀性有很大的好處。

2.為什麼需要函式過載

如果沒有函式過載機制,如在c中,你必須要這樣去做:

int add1(int a, int b);        //將int變數的值相加

float add2(float a, float b); //將float變數的值相加

int add3(int a, char b); //將int變數和char變數的值相加

float add4(float a, long b); //將float變數和long變數的值相加

而在c++中可以使用函式過載,使函式呼叫更加簡單方便,但必須遵循以下規則:

•函式名稱必須相同。

•引數列表必須不同(個數不同、型別不同或引數排列順序不同等)。

•函式的返回型別可以相同也可以不相同。

•僅僅返回型別不同不足以成為函式的過載。

3.為什麼c語言不支援函式過載而c++支援

原因很簡單,**從編譯到執行要經過以下步驟:

1.預處理 (生成.i檔案)

1)標頭檔案展開

2)巨集替換

3)去注釋

4)條件編譯

2.編譯過程:檢查語法,將高階語言轉為組合語言; (生成.s檔案)

3.彙編過程:組合語言轉為二進位制程式;(生成.o檔案)

4.鏈結部分:所引用的資料鏈結進來。(生成a.out檔案)

而編譯器在編譯時會對函式進行重新命名,在這裡以add函式為例:

//c++檔案

#include

using

namespace

std;

int add(int a, int b)

float add(float a, float b)

int add(int a, char b)

float add(float a, long b)

int main()

輸出結果為:

若將檔案重新命名為.c檔案將無法編譯。

原因在於在c語言中,編譯器在編譯後在庫中的名字全為_add ,不能進行鏈結。

而在c++中,編譯器在編譯後在庫中的名字為_z3addic等,各個函式編譯後的名字不同,編譯器可以識別各個函式,可執行鏈結。

4.為什麼函式過載不可以根據返回型別區分

如:

float add(int a, int b);

int add(int a, int b);

當你在呼叫時並不能指定型別資訊,編譯器不知道你要呼叫哪個函式。比如呼叫add(2,3)時,編譯器無法判斷到底呼叫的是那個函式,從這一點可看出函式過載不可以根據返回型別區分。

5.預設引數

所謂預設引數,顧名思義,就是在宣告函式的某個引數的時候為之指定乙個預設值,在呼叫該函式的時候如果採用該預設值,你就無須指定該引數。預設引數使用主要規則:

1.呼叫時你只能從最後乙個引數開始進行省略,換句話說,如果你要省略乙個引數,你必須省略它後面所有的引數而不能省略中間引數,即:帶預設值的引數必須放在參數列的最後面。

2.預設值必須是常量。

3.預設引數必須通過值參或常參傳遞。宣告是帶有預設引數的函式,則預設值只能寫在宣告當中。

4.若沒傳所預設的引數,則使用預設引數,若傳參了則使用所傳引數。

如:

int add(int a, int b=2)     //半預設

add(3)=5

add(4)=4

add(2,1)=3

關於C 函式過載

c 函式過載是使用形參作為特徵標,寫這篇文章是說明一下const作為函式過載特徵的情況 1 形參為引用時 void func const int val void func int val int main 2 形參為指標時 void func int p void func const int p...

C 函式過載問題

是為了方便使用,允許在同一範圍內宣告幾個功能類似的同名函式。函式名必須相同方能構成函式過載!函式返回值型別 可以相同,也可以不同 注意 函式的返回型別不足以區分兩個過載函式 但要注意的是同名的函式的簽名 引數型別 順序,返回值的型別 不能完全一致 與引數的名字無關 例如 static void sh...

關於C 的函式過載

函式過載是c 的新特性,那到底為什麼c 可以而c卻不行呢?原因在於c 編譯器會執行名稱矯正或者叫做名稱修飾。例如,可能將myfunc int 轉換為 myfunc i,而將myfunc double 轉換為 myfunc d 實際上會轉換為帶有 及亂碼的複雜形式,這裡為了便於說明,採用這種形式 而c...