C 程式設計入門系列之十(過載函式與函式模板)

2021-07-23 10:07:08 字數 2422 閱讀 9401

hello,everyone,雞啄公尺上一節講到的是函式的引數傳遞和內聯函式,這一講雞啄公尺會給大家講點稍微有點難度的函式過載和函式模板,如果大家把之前的程式設計入門課程都掌握了,這一講的內容自己上機試下就很容易理解了。

一.過載函式

現實生活中的乙個詞可能有多種含義,比如,洗衣服、洗頭、洗車,都有乙個洗字,但是他們的操作方式是不一樣的。函式也一樣,有時候它們的操作不完全一樣但是名字一樣,這就是過載函式。

過載函式就是,兩個以上的函式取相同的函式名,但是函式形參的個數或者型別不同,編譯器會根據實參與形參的型別和個數進行最佳匹配,自動確定呼叫哪乙個函式。

為什麼要有過載函式呢?因為如果沒有過載函式,那麼對不同型別的資料進行類似的操作也要定義不同名稱的函式,比如加法函式,就必須對整數加法和浮點數加法分別定義不同的函式名:

int nadd(int a, int b);

float fadd(float a, float b);

形參型別不同的例子:

int   add(int x,int y);

float add(float x,float y);

形參個數不同的例子:

int add(int x,int y);

int add(int x,int y,int z);

1.過載函式的形參不管是型別還是個數必須有一樣是不同的。因為編譯器就是看實參和哪個函式的形參的型別及個數匹配,來判斷呼叫哪個函式,如果函式名、形參型別和個數相同,即使函式返回值型別不同,編譯器也會認為是函式重複定義的語法錯誤,就是說它認為是乙個函式。以下兩種是錯誤的過載函式:

int add(int x,int y);

int add(int a,int b);

上面兩個函式雖然形參名不同,但是編譯器不會以形參名來區分函式,它會認為這是乙個函式。我們以後也要記住,若只改變形參名則函式不會變,呼叫的地方也不必變。

int add(int x,int y);

void add(int x,int y);

上面這兩個函式返回值不同,確實是兩個函式,但是編譯器也不會以返回值來區分函式,也會認為是重複定義。

2.過載函式都是進行類似的操作,不要把不同的功能定義成過載函式,否則會讓人對呼叫有誤解,比如:

int add(int x,int y)

float add(float x,float y)

這兩個函式乙個是實現的兩個數的加法,乙個是實現減法,在語法上並沒有問題。但是功能不一樣但是都叫add,我們呼叫的時候是不是會混淆?

雞啄公尺給大家乙個過載函式的例子,大家仔細研究下**,上機試下,通過上面的講解,很容易理解:

#include

using namespace std;

int add(int m,int n);       // 函式呼叫前必須先宣告函式原型

float add(float x,float y);

int _tmain(int argc, _tchar* argv)

double abs(double x)

大家觀察下這兩個函式,這兩個函式只是返回值型別和引數型別不同,功能完全一樣,如果能有辦法寫一段通用的**適用於多種不同的資料型別,就是不用像上面那樣寫兩個函式而只是一段**就能實現兩個函式的功能,那**的復用性不是更高了嗎?開發效率也會提高的。這就要函式模板來實現了。

模板是有可以使用和操作任何資料型別的通用**構成,這種程式設計叫做引數化程式設計,因為它把資料型別當成了引數,可以用來建立乙個通用功能的函式,支援多種不同型別的形參和返回值。函式模板的定義形式是:

template #include

using namespace std;

template

t abs(t x)

int _tmain(int argc, _tchar* argv)

雞啄公尺給大家分析下這個程式,編譯器會根據呼叫abs函式時傳入實參的型別來確定函式模板的型別引數是什麼型別。上面使用呼叫表示式abs(n)時,因為n是int型別,所以模板中型別引數t就是int,然後編譯器會以函式模板為樣板生成乙個函式:

int abs(int x)

同樣,對於呼叫表示式abs(d),因為d是double型別,所以型別引數t就是double,編譯器會根據函式模板生成下面的函式:

double abs(double x)

所以,abs(n)實際上呼叫的是函式模板生成的函式:int abs(int x)。而abs(d)呼叫的是由函式模板生成的函式:double abs(double x)。

最後,雞啄公尺跟大家簡單說下c++系統函式。c++系統庫中提供了幾百個函式供我們使用,我們只要用include指令包含相應的標頭檔案就可以使用了。比如,包含了math.h檔案我們就可以使用abs、sqrt、sin等函式。如果需要用到一些庫函式可以msdn上查也可以上網查。

好了,今天雞啄公尺就講到這裡了,重點掌握下過載函式吧,函式模板可能大家現在還不能很好的理解,不過可以先了解下,以後你會理解的。

C 入門 十 過載雙目運算子

在 五 我們已經介紹了過載賦值運算子,這裡就不重新說明了。一。作為類成員函式的過載 為了能進行類物件和乙個整型值的加法運算,需要寫乙個類的成員函式來過載雙目加法 運算子。該函式在類中的宣告如下 date operator int const 函式的宣告指出,返回值是乙個date類物件,函式名是運算子...

C 入門(6)過載

過載 using system class vector 獲取向量的長度 public double getlength 過載運算子 public static bool operator vector a,vector b 過載運算子 public static bool operator vec...

C 自我精講 基礎系列三 過載

c 自我精講 基礎系列三 過載 0 前言 分二部分 函式過載,操作符過載。1 函式過載 函式過載 指在同一名字空間中,函式名稱相同,引數型別 順序或數量不同的一類函式,同一函式名的函式能完成不同功能。非函式過載,只是返回值不一樣 void fun int i int fun int i 非函式過載,...