C 的探索路17 泛型程式設計與模板之基本形式

2021-08-14 07:47:51 字數 3709 閱讀 9268

按照書中的順序應當是輸入輸出流以及檔案操作兩部分的內容,相對來說,這兩部分對我目前用途不是太大,而泛型程式設計以及後續的stl部分內容有著更高的價值,所以先跳過i/o流以及檔案操作,先進行模板方面的學習與總結,後續再對剩下的這些內容進行整理。

整體學習結束以後將進行一星期左右的c++習題課練習,下一步進行資料結構系列的了解與學習。

我們日常生活中接觸最多的帶「泛」的詞語可能就是「廣泛」,也就是說這是一種傳播方面具備廣度的行為。從字面意義上理解,泛型指的就是能廣泛使用的資料型別。

泛型程式設計(generic programming)是一種演算法在實現時不指定具體要操作的資料型別的程式設計方法。

這種程式設計思想運用最為深度的內容就是stl(標準模板庫),該部分也會在下一部分進行介紹。

整體來說,泛型程式設計帶來的好處與其所起的意義,絲毫不亞於物件導向的特性。因此需要好好對這一方面進行掌握。

模板為泛型程式設計中的乙個基本概念,c++中,模板分為函式模板和類模板兩種。

熟練的c++程式設計師,在編寫函式的時候都會考慮能否把函式編寫為函式模板;在編寫類的時候考慮將其編寫為類模板,從而方便重用。

書中的幾個章節依據標題內容分為基本形式與細節兩個部分,本篇文章對泛型程式設計與模板的基本形式內容進行學習與練習。該部分內容為函式模板以及類模板。

函式模板

函式模板分為四部分進行了解,依次涉及函式模板的作用、原理、例子以及呼叫細節。

我們知道c++是一種很注重資料型別的語言,編寫任何函式時,都需要考慮到其引數型別的匹配。

雖然這樣能夠避免發生錯誤,但這也在一定程度上容易引起一些麻煩:比如我們要定義交換函式swap對數字進行交換。

除了函式實現的主體外,還需考慮的事就是資料型別:是對double型別的資料進行交換還是int型進行交換?如果都有,很不幸,你要寫兩次交換函式:

#includeusing namespace std;

void swap(int &a, int &b)

void swap(double &a, double &b)

int main()

int main()

這樣,就可以避免寫好幾個swap進行交換了。

編譯器由模板自動生成函式的過程,稱為模板的例項化,由例項化得到的函式,稱為模板函式。

設計乙個分數類cfraction,再設計乙個名為maxelement的函式模板,能夠求陣列中最大的元素,並用該模板求乙個cfraction陣列中的最大元素

templatet maxelement(t a, int size) 

class cfraction ;

bool operator

bool operator==(const cfraction&f)const

friend ostream&operator<

};ostream&operator<

int main() ;

cfraction f[4] = ;

cout << maxelement(a, 5) << endl;

cout << maxelement(f, 4) << endl;

return 0;

}

這部分對為什麼過載==運算子不是很清楚,先行跳過。

函式或函式模板呼叫語句的順序

具體內容波瀾不驚,扔一張圖

程式一共定義三個max函式,當然他們沒有實現最大值返回的功能。

第乙個max函式為具備兩個形參,且型別相同的函式模板。

第二個max函式為具備兩個不同型別的函式模板

第三個max為我們常見的普通函式

在主函式中,首先定義了整型變數i,j。

第乙個max函式直接與普通函式的形參列表相同,依據首先呼叫普通函式原則,輸出:function max

第二個max為整形引數,依據模板匹配原則,輸出template max 1

第三個max乙個引數相同,乙個不同,則輸出template max2

知道你們喜歡看犯錯,那就犯乙個錯吧,直接會崩潰的那種,是不是萌萌噠?

下面這個程式定義了兩個string型別的變數,顯然沒有任何乙個型別可以轉換成功, 那麼崩吧。

templatet max(t a, t2 b) 

double max(double a, double b)

int main()

template《型別參數列》

class 類模板名

類模板的成員函式,在類模板定義外面編寫時的語法如下:

template《型別參數列》

返回值型別 類模板名《型別參數列》::成員函式名(參數列)

用類模板定義物件可以寫做

類模板名《真實型別參數列》物件名(實際參數列);

如果類模板有無參建構函式,那麼也可以只寫:

類模板名《真實型別參數列》物件名;

某項資料記錄由兩部分組成:關鍵字與值,其中關鍵字用來檢索。比如,學生記錄由學號和績點註冊成。程式如下:

#includetemplateclass pair ;

bool operator

};templatebool pair::operator

int main()

emmm,貌似有點複雜,逐條來看。

首先定義了乙個類模板pair,類模板內部包含成員變數key,value。建構函式pair(t1 k,t2 v);以及過載了乙個返回值為bool型別的《比較函式。

其內部需要輸入乙個同引數的物件,也就是pair,注意pair不是怪物而是p的型別。

在外部呼叫的時候也要同等對待。

主函式基本啥也沒做,就起了個輸出的作用。

類模板中的成員函式還可以是乙個函式模板。成員函式模板只有在呼叫時,才會被例項化

templateclass a 

};int main()

類模板與函式模板為泛型程式設計中最直接、最基本的體現,這兩種技術均利用了**的重用性,能夠在一定程度上減少**的使用量。

其基本形式都差不太多,比如函式模板的形式為:

template

t1 function(t2 a, t3 b...){

類模板的形式為

template

class classname{

public:

t1 a;

t2 b;

利用型別進行傳參。

要記住,泛型程式設計是針對型別的程式設計,是為了減少寫型別帶來的麻煩現象。只要把它當做型別就好了

C 的探索路19 泛型程式設計與模板之練習題

泛型程式設計的新知識點不多,主要強調的是乙個型別的概念 選幾道練習題來做做。templatet max t a,t b double max double a,double b int main 這個考的就是型別匹配的問題,程式定義了兩個max函式,其中乙個為函式模板t max t a,t b 另外...

C 回顧之模板與泛型程式設計

oop能處理型別在程式執行之前都未知的情況 而在泛型程式設計中,在編譯時就能獲知型別了。編譯器會根據型別生成相應的模板例項。unsigned不加型別名時,預設表示無符號整型。非型別模板引數 函式模板和類模板成員函式的定義通常放在標頭檔案中。乙個類模板的成員函式只有當程式用到它時才進行例項化。在乙個類...

C 模板與泛型程式設計

1 物件導向程式設計總是以顯式介面和執行時多型解決問題。模板及泛型世界不同,在此世界中顯式介面和執行時多型仍然存在,但重要性降低,反倒是隱式介面和編譯器多型移到前頭。執行時多型和編譯時多型 前者表示哪乙個虛函式該被繫結,後者表示哪乙個過載函式該被呼叫。顯式介面由函式的簽名式 函式名稱 引數型別 返回...