<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
C++語言全盤繼承了C語言的標準庫,其中包換非常豐富的系統函數,例如輸入/輸出函數、數學函數、字串處理常式和動態記憶體分配函數等。C++語言另外又增加了一些新的庫,我們把C++語言新增的這部分庫稱為C++標準庫。C++語言的模板技術包括函數模板和類別範本。模板技術是一種程式碼重用技術,函數和類是C++語言中兩種主要的重用程式碼形式。程式碼模板使源程式更加凝練。
函數模板的基本原理是通過資料型別的引數化,將一組演演算法相同但所處理資料型別不同的過載函數凝練成一個函數模板。
函數模板的定義語法形式:
template <型別參數列>
函數型別 函數名(形參參數列)
{
函數體
}
函數模板的幾點語法細則:
範例:
#include<iostream> using namespace std; template <typename T> //定義函數模板Max,宣告一個型別引數T T Max(T x,T y) //使用型別引數T定義函數型別和形參x和y的型別 { return(x>y?x:y); } int main() { cout << Max(5,10) <<endl; //呼叫返回最大值10 cout << Max(5.2,10.2) <<endl; //呼叫返回最大值10.2 return 0; }
函數模板可以像普通函數一樣被呼叫。再呼叫者看來,函數模板的型別引數像是一種通用資料型別。
函數模板是具有型別引數的函數。型別引數是表示資料型別的引數,可指代任意一種實際資料型別。編譯器再編譯到函數模板的呼叫語句時,根據位置對應關係從實引資料型別推匯出型別引數所指代的資料型別,然後按照函數模板自動生成一個該型別的函數定義程式碼。不同型別實參的函數模板呼叫語句將生成不同型別的過載函數。函數模板將資料型別引數化,呼叫時會呈現引數多型性。
跟普通函數一樣函數模板也需要先定義後呼叫的原則。如果函數模板定義再呼叫後,或定義再其他程式檔案中,則應先宣告後呼叫。函數模板的宣告語法形式為:
template <型別參數列>
函數型別 函數名(形參參數列);
或
template <型別參數列> 函數型別 函數名(形參參數列);
#include<iostream> using namespace std; template <typename T> //函數模板Max定義宣告 T Max(T x,T y); int main() { cout << Max(5,10) <<endl; //函數模板Max使用 cout << Max(5.2,10.2) <<endl; return 0; } template <typename T> //函數模板Max定義 T Max(T x,T y) { return(x>y?x:y); }
程式設計師再程式設計時可以靈活使用模板技術。在定義多個過載函數時可以考慮是否將他們定義成一個函數模板,這樣可以凝練函數程式碼。再定義單個函數時也可以考慮定義成函數模板,這樣可以提高函數程式碼的可重用性。對於呼叫函數模板的程式設計師而言,函數模板和普通函數沒有什麼區別。唯一不同的時函數模板可以處理不同型別的資料。
應用模板技術,也可以將一組功能相同但所處理資料型別不同的類凝練成一個類別範本。編譯時,再由編譯器按照類別範本自動生成針對不同資料型別的類定義程式碼。
定義類別範本的語法形式:
template <型別參數列>
class 類名 //類宣告部分
{
類成員宣告
}
//類實現部分:所有類外定義的函數成員,必須按如下的語法形式將它們定義成函數模板
template <型別參數列>
函數型別 類名<型別引數名列表>::函數名(形式參數列)
{ 函數體 }
類別範本的幾點語法細則:
定義好的類別範本可以像普通類一樣被用來定義物件。使用類別範本定義物件時,需要明確給出類別範本中型別引數所指代的實際資料型別。其語法形式如下:類別範本名 <實際資料型別列表> 物件名1,物件名2 .....;
類別範本語法範例:
在類內定義函數成員(內聯)
#include<iostream> using namespace std; template <typename T> //類別範本A class A //類宣告部分 { private: //宣告兩個私有資料成員 T a1; int a2; public: A(T p1,int p2) //定義建構函式 { a1 = p1; a2 = p2} void Show() //顯示資料成員 { cout << a1 <<","<<a2 <<endl;} T Sum() //求資料成員的和 {return (T)(a1+a2); } }; //無類實現部分 int main() { //用類別範本定義物件 A <double> o1(10.5,6); //double型物件 o1.Show(); //顯示:10.5,6 cout<<o1.Sum()<<endl;//顯示:16.5 A <int> o2(10,6); //int型物件 o2.Show(); //顯示:10,6 cout<<o1.Sum()<<endl;//顯示:16 return 0; }
在類外定義函數模板成員
#include<iostream> using namespace std; template <typename T> //類別範本A class A //類宣告部分 { private: //宣告兩個私有資料成員 T a1; int a2; public: A(T p1,int p2); //定義建構函式 void Show(); //顯示資料成員 T Sum(); //求資料成員的和 }; //類實現部分 template <typename T> A <T>::A(T p1,int p2) { a1 = p1; a2 = p2} template <typename T> void A <T>::Show() { cout << a1 <<","<<a2 <<endl;} template <typename T> T A <T>::Sum() {return (T)(a1+a2); } int main() { //用類別範本定義物件 A <double> o1(10.5,6); //double型物件 o1.Show(); //顯示:10.5,6 cout<<o1.Sum()<<endl;//顯示:16.5 A <int> o2(10,6); //int型物件 o2.Show(); //顯示:10,6 cout<<o1.Sum()<<endl;//顯示:16 return 0; }
當定義到類別範本定義物件語句時,編譯器將根據所給出的實際資料型別來取代型別引數T。例如A <double> o1(10.5,6); 編譯時將類別範本中類型別引數繫結到某個具體資料型別的過程,稱為類別範本的範例化。範例化所生成的類稱為類別範本的範例類。範例類是一個普通的類,可以用來定義物件。
類別範本編譯原理:類別範本是具有型別引數的類。型別引數是表示資料型別的引數,可指代任意實際資料型別。編譯器在編譯到使用類別範本定義物件語句時,將首先按照所給定的實際資料型別對類別範本進行範例化,生成一個範例類。最終,編譯器使用範例類來定義所需要的物件。
類別範本可以被繼承,派生出新類。以類別範本為基礎類別定義派生類,可以在派生時範例化,也可以繼續定義派生類別範本。
1、定義範例化派生類
定義範例化派生類就是在派生類繼承基礎類別的時候將型別引數賦值,此時派生類對基礎類別進行範例化。
範例化派生類範例
#include<iostream> using namespace std; template <typename T> //類別範本基礎類別Base class Base //類宣告部分 { private: //宣告私有資料成員 T a; public: Base(T x) { a=x; } void Show() { cout<< "a="<<a<<","; } }; //無類實現部分 class Derived:public Base<double> //公有繼承基礎類別模板Base,派生時範例化 { private: //宣告新增資料成員 int b; public: //注意派生類建構函式寫法 Derived(double p1,int p2):Base<double>(p1) { b=p2; } //新增函數成員Show void Show() { Base <double>::Show(); cout<< "b="<<b<<endl; } }; int main() { Derived obj(10.5,6);//定義派生類Derived物件obj obj.Show(); //顯示結果:a=10.5,b=6 return 0; }
在編譯到派生類Derived的定義程式碼時,編譯器將按照所給定的實際資料型別double對類別範本Base進行範例化,生成一個double型的範例類,最終派生類Derived繼承的是該範例類。
2、定義派生類別範本
定義派生類別範本是派生類在繼承類別範本基礎類別時不進行範例化,因此派生類仍然是一個類別範本。
派生類別範本範例
#include<iostream> using namespace std; template <typename T> //類別範本基礎類別Base class Base //類宣告部分 { private: //宣告私有資料成員 T a; public: Base(T x) { a=x; } void Show() { cout<< "a="<<a<<","; } }; //無類實現部分 //公有繼承類別範本Base,派生類仍為類別範本 template <typename T,typename TT> //新增型別引數TT class Derived:public Base<T> //公有繼承基礎類別模板Base,定義派生類別範本 { private: //宣告新增資料成員 TT b; public: //注意派生類建構函式寫法 Derived(T p1,TT p2):Base<T>(p1) { b=p2; } //新增函數成員Show void Show() { Base <T>::Show(); cout<< "b="<<b<<endl; } }; int main() { Derived<double,int> obj(10.5,6);//定義派生類Derived物件obj obj.Show(); //顯示結果:a=10.5,b=6 return 0; }
和其他類別範本一樣,派生類別範本Derived在定義物件時需要明確給出派生類別範本中型別引數所指代的實際資料型別。程式設計師程式設計時,在定義多個功能相同但處理資料型別不同的類時應考慮是否可以將它們合併成一個類別範本,這樣可以凝練程式碼。再定義單個類時也可以考慮升級成類別範本,這樣可以提高函數程式碼的可重用性。對於呼叫類別範本的程式設計師而言,類別範本和普通類沒有什麼區別。只是在使用類別範本時需要給出型別引數所指代的實際資料型別。
到此這篇關於C++函數模板和類別範本的文章就介紹到這了,更多相關C++函數模板和類別範本內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45