亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++函數模板與類模板實例解析

2020-01-26 15:23:59
字體:
來源:轉載
供稿:網友

本文針對C++函數模板與類模板進行了較為詳盡的實例解析,有助于幫助讀者加深對C++函數模板與類模板的理解。具體內容如下:

泛型編程(Generic Programming)是一種編程范式,通過將類型參數化來實現在同一份代碼上操作多種數據類型,泛型是一般化并可重復使用的意思。泛型編程最初誕生于C++中,目的是為了實現C++的STL(標準模板庫)。

模板(template)是泛型編程的基礎,一個模板就是一個創建類或函數的藍圖或公式。例如,當使用一個vector這樣的泛型類型或者find這樣的泛型函數時,我們提供足夠的信息,將藍圖轉換為特定的類或函數。

一、函數模板

一個通用的函數模板(function template)就是一個公式,可用來生成針對特定類型或特定值的函數版本。模板定義以關鍵字template開始,后面跟一個模板參數列表,列表中的多個模板參數(template parameter)以逗號分隔。模板參數表示在類或函數定義中用到的類型或值。

1、類型參數

一個模板類型參數(type parameter)表示的是一種類型。我們可以將類型參數看作類型說明符,就像內置類型或類類型說明符一樣使用。類型參數前必須使用關鍵字class 或typename:

template <typename T> // typename和class一樣的 T function(T* p) {   T tmp = *p;  // 臨時變量類型為T   //...   return tmp;  // 返回值類型為T } 

關鍵字typename和class是一樣的作用,但顯然typename比class更為直觀,它更清楚地指出隨后的名字是一個類型名。

編譯器用模板類型實參為我們實例化(instantiate)特定版本的函數,一個版本稱做模板的一個實例(instantiation)。當我們調用一個函數模板時,編譯器通常用函數實參來為我們推斷模板實參。當然如果函數沒有模板類型的參數,則我們需要特別指出來:

int a = 10; cout << function(&a) << endl;   // 編譯器根據函數實參推斷模板實參  cout << function<int>(&a) << endl;  // <int>指出模板參數為int 

2、非類型參數

在模板中還可以定義非類型參數(nontype parameter),一個非類型參數表示一個值而非一個類型。我們通過一個特定的類型名而非關鍵字class或typename來指定非類型參數:

// 整形模板 template<unsigned M, unsigned N> void add() {   cout<< M+N << endl; }  // 指針 template<const char* C> void func1(const char* str) {   cout << C << " " << str << endl; }  // 引用 template<char (&R)[9]> void func2(const char* str) {   cout << R << " " << str << endl; }  // 函數指針 template<void (*f)(const char*)> void func3(const char* c) {   f(c); }  void print(const char* c) { cout << c << endl;}  char arr[9] = "template";  // 全局變量,具有靜態生存期  int main() {   add<10, 20>();   func1<arr>("pointer");   func2<arr>("reference");   func3<print>("template function pointer");   return 0; } 

當實例化時,非類型參數被一個用戶提供的或編譯器推斷出的值所替代。一個非類型參數可以是一個整型,或者是一個指向對象或函數的指針或引用:綁定到整形(非類型參數)的實參必須是一個常量表達式,綁定到指針或引用(非類型參數)的實參必須具有靜態的生存期(比如全局變量),不能把普通局部變量 或動態對象綁定到指針或引用的非類型形參。

二、類模板

相應的,類模板(class template)是用來生成類的藍圖。與函數模板的不同之處是,編譯器不能為類模板推斷模板參數類型,所以我們必須顯式的提供模板實參。與函數模板一樣,類模板參數可以是類型參數,也可以是非類型參數,這里就不再贅述了。

template<typename T> class Array { public:   Array(T arr[], int s);   void print(); private:   T *ptr;   int size; };  // 類模板外部定義成員函數 template<typename T> Array<T>::Array(T arr[], int s) {   ptr = new T[s];   size = s;   for(int i=0; i<size; ++i)     ptr[i]=arr[i]; }  template<typename T> void Array<T>::print() {   for(int i=0; i<size; ++i)     cout << " " << *(ptr+i);   cout << endl; }  int main() {   char a[5] = {'J','a','m','e','s'};   Array<char> charArr(a, 5);   charArr.print();    int b[5] = { 1, 2, 3, 4, 5};   Array<int> intArr(b, 5);   intArr.print();    return 0; }

類模板的成員函數

與其他類一樣,我們既可以在類模板內部,也可以在類模板外部定義其成員函數。定義在類模板之外的成員函數必須以關鍵字template開始,后接類模板參數列表。

template <typename T> return_type class_name<T>::member_name(parm-list) { } 

默認情況下,對于一個實例化了的類模板,其成員函數只有在使用時才被實例化。如果一個成員函數沒有被使用,則它不會被實例化。

類模板和友元

當一個類包含一個友元聲明時,類與友元各自是否是模板是相互無關的。如果一個類模板包含一個非模板的友元,則友元被授權可以訪問所有模板的實例。如果友元自身是模板,類可以授權給所有友元模板的實例,也可以只授權給特定實例。

// 前置聲明,在將模板的一個特定實例聲明為友元時要用到 template<typename T> class Pal;  // 普通類 class C {   friend class Pal<C>; // 用類C實例化的Pal是C的一個友元   template<typename T> friend class Pal2; //Pal2所有實例都是C的友元;無須前置聲明 };  // 模板類 template<typename T> class C2 {   // C2的每個實例將用相同類型實例化的Pal聲明為友元,一對一關系   friend class Pal<T>;   // Pal2的所有實例都是C2的每個實例的友元,不需要前置聲明   template<typename X> friend class Pal2;    // Pal3是普通非模板類,它是C2所有實例的友元   friend class Pal3; }; 

類模板的static成員

類模板可以聲明static成員。類模板的每一個實例都有其自己獨有的static成員對象,對于給定的類型X,所有class_name<X>類型的對象共享相同的一份static成員實例。

template<typename T> class Foo { public:   void print();   //...其他操作 private:   static int i; };  template<typename T> void Foo<T>::print() {   cout << ++i << endl; }  template<typename T> int Foo<T>::i = 10; // 初始化為10  int main() {   Foo<int> f1;   Foo<int> f2;   Foo<float> f3;   f1.print();  // 輸出11   f2.print();  // 輸出12   f3.print();  // 輸出11   return 0; }

我們可以通過類類型對象來訪問一個類模板的static對象,也可以使用作用域運算符(::)直接訪問靜態成員。類似模板類的其他成員函數,一個static成員函數也只有在使用時才會實例化。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕在线看视频国产欧美在线看完整| 欧美大片在线看| 国内免费久久久久久久久久久| 欧美一区二区三区四区在线| 亚洲欧美日韩爽爽影院| 欧美精品在线播放| 久久久久99精品久久久久| 国产精品r级在线| 成年人精品视频| 国产精品999999| 欧美日韩国产一区中文午夜| 久久高清视频免费| 日韩精品视频在线免费观看| 欧美精品在线免费播放| 丝袜情趣国产精品| 一本一本久久a久久精品综合小说| 91精品国产高清久久久久久| 欧美色道久久88综合亚洲精品| 中文字幕国产精品久久| 亚洲黄一区二区| 亚洲第一天堂无码专区| 久久免费视频在线| 亚洲精品国产精品国自产在线| 九九精品在线视频| 7777精品视频| 亚洲丁香婷深爱综合| 欧美午夜精品久久久久久人妖| 亚洲图片欧美午夜| 欧美国产高跟鞋裸体秀xxxhd| 日本精品在线视频| 亚洲风情亚aⅴ在线发布| 色婷婷综合久久久久中文字幕1| 日韩一区二区精品视频| 国产+人+亚洲| 国产精品免费视频久久久| 亚洲最大的av网站| 成人激情视频在线观看| 日韩美女激情视频| 欧美俄罗斯性视频| 91亚洲人电影| 国产99久久精品一区二区 夜夜躁日日躁| 91在线看www| 日韩av在线看| 91在线观看免费| 奇米四色中文综合久久| 国产一区二区三区在线免费观看| 亚洲欧美三级伦理| 在线国产精品播放| 日韩精品久久久久| 中文字幕无线精品亚洲乱码一区| 97在线精品国自产拍中文| 精品视频一区在线视频| 国产剧情久久久久久| 4388成人网| 欧美国产日本高清在线| 日韩电影视频免费| 欧美激情亚洲自拍| 欧美精品在线视频观看| 久久av在线播放| 欧美中文字幕在线| 97国产suv精品一区二区62| 中文字幕亚洲专区| 国产欧美一区二区三区视频| 伊人久久大香线蕉av一区二区| 欧美午夜精品在线| 欧美激情视频一区二区三区不卡| 国产一区二区在线免费视频| 成人免费xxxxx在线观看| 国产精品爽爽ⅴa在线观看| 成人精品视频在线| 亚洲成人免费在线视频| 日韩一中文字幕| 日韩在线视频播放| 高清在线视频日韩欧美| 精品亚洲va在线va天堂资源站| 黑人巨大精品欧美一区二区| 热99精品只有里视频精品| 国产精品久久网| 日本高清不卡的在线| 亚洲乱码国产乱码精品精天堂| 在线看日韩欧美| 欧洲成人免费aa| 日韩视频免费观看| 亚洲精品女av网站| 欧美日韩国产在线播放| 538国产精品一区二区免费视频| 91精品国产高清久久久久久久久| 国产精品久久久亚洲| 91精品国产综合久久香蕉最新版| 国产精品精品国产| 亚洲欧美日韩久久久久久| 欧美性猛交xxxx| 国产精品www色诱视频| 在线播放亚洲激情| 亚洲人成电影网站色…| 亚洲va欧美va在线观看| 亚洲激情视频在线| 亚洲一区二区三区四区视频| 国产玖玖精品视频| 亚洲电影免费在线观看| 色无极影院亚洲| 久久久精品国产一区二区| 亚洲精品一区av在线播放| 亚洲国产另类久久精品| 欧美电影在线观看网站| 综合136福利视频在线| 欧美日韩在线另类| 国产69精品久久久久9999| 久热在线中文字幕色999舞| 亚洲乱码一区二区| 91tv亚洲精品香蕉国产一区7ujn| 欧美天堂在线观看| 国产亚洲一级高清| 国产精品免费看久久久香蕉| 国产一区二区三区在线观看网站| 午夜精品一区二区三区av| 成人黄色av网站| 亚洲福利在线播放| 亚洲va久久久噜噜噜| 国产91精品视频在线观看| 97视频色精品| 一本色道久久综合狠狠躁篇怎么玩| 欧美人成在线视频| 国产精品老女人视频| 992tv成人免费影院| 色偷偷av亚洲男人的天堂| 97超级碰碰碰| 欧美电影免费观看电视剧大全| 精品成人av一区| 亚洲精品狠狠操| 日本aⅴ大伊香蕉精品视频| 欧美老女人性视频| 亚洲va国产va天堂va久久| 亚洲aⅴ日韩av电影在线观看| 国产精品麻豆va在线播放| 精品亚洲一区二区三区四区五区| 久久网福利资源网站| 亚洲国产精品va在线看黑人动漫| 97免费中文视频在线观看| 久热精品视频在线免费观看| 亚洲一区二区日本| 国产精品久久久久秋霞鲁丝| 亚洲第一中文字幕| 日本国产欧美一区二区三区| 国内免费精品永久在线视频| 俺去了亚洲欧美日韩| 精品亚洲一区二区三区| 正在播放欧美一区| 日韩高清av在线| 亚洲无亚洲人成网站77777| 日韩免费电影在线观看| 亚洲视频欧美视频| 精品国产户外野外| 亚洲视频网站在线观看| 中文字幕国产亚洲| 亚洲精品短视频| 久久久久久久久久久免费精品| 精品国产精品自拍| 97香蕉超级碰碰久久免费的优势| 国产精品视频白浆免费视频| 中文字幕9999| 亚洲欧洲日本专区| 国产精品自拍网| 国产精品视频26uuu|