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...