函式的過載與預設引數的使用與錯誤糾正

2021-10-07 18:52:19 字數 3222 閱讀 4992

目錄

函式的過載

函式的過載是什麼?

函式過載的要求

函式過載舉例

函式的預設引數

函式的過載與函式的預設引數的區別

函式預設引數有何用處

由以上示例,我們要注意哪些事項呢?

函式的過載與函式的預設引數一起使用會發生什麼?

我們需要的函式一般要有普適性,就是對於一類問題有處理能力,比如:我想要找出兩個float變數的最大值,或者兩個int型變數的最大值。這種一種函式實現一類功能的情況就叫做函式的過載。

既然要使得乙個函式針對不同形參實現不同功能,那我們該如何正確的過載呢:

保證函式過載的形參不同,即引數的順序,引數的資料型別,引數的個數三者中至少有乙個是不同的才可以。

大家又說「為什麼僅函式返回值不同不行呢?」

函式一般可以通過指標與引用來修改傳入引數的值,因此函式有時可不需要返回值,那麼函式的返回值型別已不是函式過載的重要條件。

#include using namespace std;  

// 函式通過形參的位址改變形參,無需返回值  

int get_max_min(int x, int y, int *z)  

float get_max_min(float x, float y, float *z)  

int main()  

相同點:

函式的過載與函式的預設引數都可以實現函式對於一類問題的處理,因此兩者不可同時對同一函式使用,這樣的話系統執行時會報錯。

不同點:

① 函式的過載可以使得同名函式根據不同形參個數,不同形參順序,不同形參型別實現不同功能,而函式的預設引數僅可以使函式根據不同形參個數實現不同功能;

② 函式的過載是在編寫多個重名函式,而函式的預設引數是在乙個函式內實現的。

我想要實現乙個函式可以根據輸入變數來輸出陣列內的最大值 或 最小值 或 最大值和最小值,如下示例:

① 輸出陣列內的最大值與最小值

#include using namespace std;  

void get_min_max(int *num, int length, int *num_max, int *num_min)  

int max_num = 0, min_num = 0, i = 0;  

for (; i 

if (min_num > num[i])  

}  if (num_max != null)  

if (num_min != null)  

}    

int main()  

;      get_min_max(iarray, 10, &max_num, &min_num);  

cout <

}

② 僅輸出陣列的最小值

#include using namespace std;  

// 採用預設引數,新增預設引數的形參一定單獨要在最後一部分,不可以和無缺省引數的形參混合宣告  

void get_min_max(int *num, int length, int *num_max = null, int *num_min = null)  

int max_num = 0, min_num = 0, i = 0;  

for (; i 

if (min_num > num[i])  

}  if (num_max != null)  

if (num_min != null)  

}    

int main()  

;      get_min_max(iarray, 10, null, &min_num);  // 由於null在中間,因此不可以省略不寫

cout <

}

③ 僅輸出最大值

#include using namespace std;  

// 採用預設引數,新增預設引數的形參一定單獨要在最後一部分,不可以和無缺省引數的形參混合宣告  

void get_min_max(int *num, int length, int *num_max = null, int *num_min = null)  

int max_num = 0, min_num = 0, i = 0;  

for (; i 

if (min_num > num[i])  

}  if (num_max != null)  

if (num_min != null)  

}    

int main()  

;      get_min_max(iarray, 10, &max_num);  // 由於後面為null,故省略不寫

cout <

}

① 有預設引數的形參一定要單獨寫一塊,在函式的形參中先寫不帶預設引數的形參,再寫帶預設引數的形參;

② 過載和預設引數不可對同一函式使用,否則會發生錯誤;

③ 從函式編譯實現角度而言,過載是在函式體外部實現的,預設引數是在函式體內部實現的,因此預設引數比重載要複雜一些。

#include using namespace std;  

// 採用預設引數,新增預設引數的形參一定單獨要在最後一部分,不可以和無缺省引數的形參混合宣告  

void get_min_max(int *num, int length, int *num_max = null, int *num_min = null)  

int max_num = 0, min_num = 0, i = 0;  

for (; i 

if (min_num > num[i])  

}  if (num_max != null)  

if (num_min != null)  

}    

void get_min_max(int *num, int length) // 函式過載  

int main()  

;      get_min_max(iarray, 10, &max_num);  

cout <

get_min_max(iarray, 10); // 含有兩個引數的函式呼叫  

}

輸出結果:

我們從結果中可以看出:

系統區分不了含有兩個引數的函式應該執行哪乙個,系統直接懵了。

預設引數與函式過載

預設引數是 宣告或定義函式時為函式的 引數指定乙個預設值。在呼叫該函式時,如果沒有指定實參則採用該預設值,否則使用指定的實參。void testfunc int a 0 注意 如果生命與定義位置同時出現,恰巧兩個位置提供的值不同,那編譯器就無法確定到底該用那個預設值。3.預設值必須是常量或者全域性變...

預設引數與函式過載

一.預設引數 形參a和b都帶有預設值 使用者用掉該函式時,沒傳參,就用預設值。傳參就用所傳值。1,分類 1.全預設引數 每個引數都帶有預設值 void t int a 1,int b 2,int c 3 int t 不能過載,引數列表相同,不能過載。注意 如果兩個函式僅僅是返回型別不同,則不能構過載...

c 函式過載與預設引數

函式過載 是指同一作用域內,一組具有相同函式名,不同引數列表的函式,構成過載關係,這組名稱相同的函式成為過載函式。過載函式通常完成的功能相近,這樣做的好處是減少了函式名的數量,提高了程式的可讀性。注意 過載與函式的返回型別無關,引數相同僅返回值不同的兩個函式不構成過載關係,與形參名字無關,只與引數的...