日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中的类模板

發(fā)布時間:2025/4/5 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中的类模板 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1 C++中的類模板簡介
    • 2 繼承中類模板的使用
      • 2.1 父類一般類、子類是模板類
      • 2.2 子類一般類、父類是模板類
      • 2.3 父類和子類均為模板類
    • 3 類模板的工程應用
    • 4 多參數(shù)類模板和類模板的特化
      • 4.1 多參數(shù)類模板
      • 4.2 類模板的特化
      • 4.3 重定義和特化的不同
    • 5 模板類的特殊用法
      • 5.1 模板類遇到友元函數(shù)
      • 5.2 類模板遇上靜態(tài)成員

1 C++中的類模板簡介

我們知道,有些類主要用于存儲和組織數(shù)據(jù)元素,類中數(shù)據(jù)組織的方式和數(shù)據(jù)元素的具體類型無關,如:數(shù)組類、鏈表類、Stack類、Queue類等。C++中將模板的思想應用于類,使得類的實現(xiàn)不關注數(shù)據(jù)元素的具體類型,而只關注類所需要實現(xiàn)的功能。

C++中的類模板:

  • 以相同的方式處理不同的類型。
  • 在類聲明前使用template進行標識。
  • <typename T>用于說明類中使用的泛指類型T。
  • 聲明的泛指類型T可以出現(xiàn)在類模板的任意地方。


類模板的應用:

  • 只能顯示指定具體類型,無法自動推導。
  • 使用具體類型<Type>定義對象。


編譯器對類模板的處理方式和函數(shù)模板相同:

  • 從類模板通過具體類型產(chǎn)生不同的類。
  • 在聲明的地方對類模板代碼本身進行編譯。
  • 在使用的地方對參數(shù)替換后的代碼進行編譯(成員函數(shù)也是分步編譯,調(diào)用了哪個成員函數(shù)就對哪個成員函數(shù)進行編譯)。

編程實驗:類模板初探

#include <iostream> #include <string>using namespace std;template < typename T > class Operator { public:T add(T a, T b){return a + b;}T minus(T a, T b){return a - b;}T multiply(T a, T b){return a * b;}T divide(T a, T b){return a / b;} };string operator-(string& l, string& r) {return "Minus"; }int main() {Operator<int> op1;cout << op1.add(1, 2) << endl;Operator<string> op2;cout << op2.add("D.T.", "Software") << endl;cout << op2.minus("D.T", "Software") << endl;return 0; }

2 繼承中類模板的使用

2.1 父類一般類、子類是模板類

class B { public:B(int b){this->b = b;}private:int b; };template <typename T> class A : public B { public://函數(shù)的參數(shù)列表使用虛擬類型A(T t) : B (0){this->t = t;}//成員函數(shù)返回值使用虛擬類型T &getT(){return t;}private://成員變量使用虛擬類型T t; };

父類一般類,子類是模板類, 和普通繼承的玩法類似。

2.2 子類一般類、父類是模板類

template <typename T> class A { public://函數(shù)的參數(shù)列表使用虛擬類型A(T t){this->t = t;}//成員函數(shù)返回值使用虛擬類型T &getT(){return t;}private://成員變量使用虛擬類型T t; };class B : public A<int> { public:B(int b){this->b = b;}private:int b; };

子類是一般類,父類是模板類,繼承時必須在子類里實例化父類的類型參數(shù)。

2.3 父類和子類均為模板類

template <typename T> class A { public://函數(shù)的參數(shù)列表使用虛擬類型A(T t){this->t = t;}//成員函數(shù)返回值使用虛擬類型T &getT(){return t;}private://成員變量使用虛擬類型T t; };template <typename Tb> class B: public A<Tb> {public:B(Tb b):A<Tb>(b){this->b = b;}private:Tb b;};

父類和子類都時模板類時,子類的虛擬的類型可以傳遞到父類中。


3 類模板的工程應用

類模板的工程應用:

  • 類模板必須在頭文件中定義。
  • 類模板不能分開實現(xiàn)在不同的文件中。
  • 類模板外部定義的成員函數(shù)需要加上模板<>聲明,成員函數(shù)的內(nèi)部加不加都是可以的。

編程實驗:模板類的工程應用
operator.h:

#ifndef _OPERATOR_H_ #define _OPERATOR_H_template < typename T > class Operator { public:T add(T a, T b);T minus(T a, T b);T multiply(T a, T b);T divide(T a, T b); };template < typename T > T Operator<T>::add(T a, T b) {return a + b; }template < typename T > T Operator<T>::minus(T a, T b) {return a - b; }template < typename T > T Operator<T>::multiply(T a, T b) {return a * b; }template < typename T > T Operator<T>::divide(T a, T b) {return a / b; }#endif

main.cpp:

#include <iostream> #include <string> #include "Operator.h"using namespace std;int main() {Operator<int> op1;cout << op1.add(1, 2) << endl;cout << op1.multiply(4, 5) << endl;cout << op1.minus(5, 6) << endl;cout << op1.divide(10, 5) << endl;return 0; }

我們在有些地方也會看到類模板的聲明和實現(xiàn)是放在兩個不同的文件中,但是因為類模板的特殊實現(xiàn),我們應在使用類模板時使用#include 包含 實現(xiàn)部分的.cpp 或.hpp文件(如果一個文件是hpp結尾,那么代表當前文件是類模板的實現(xiàn))。這樣的作法顯然有點過于繁瑣,因此還是定義在同一個文件中比較合適!


4 多參數(shù)類模板和類模板的特化

4.1 多參數(shù)類模板

類模板可以定義任意多個不同的類型參數(shù)。

4.2 類模板的特化

類模板可以被特化:

  • 指定類模板的特化實現(xiàn)。
  • 部分類型參數(shù)必須顯示指定。
  • 根據(jù)類型參數(shù)分開實現(xiàn)類模板。

類模板的特化類型:

  • 部分特化:用特定規(guī)則約束類型參數(shù)。
  • 完全特化:完全顯示指定類型參數(shù)。

部分特化:

完全特化:

類模板特化注意事項:

  • 特化只是模板的分開實現(xiàn),本質(zhì)上是同一個類模板。
  • 特化模板的使用方式是統(tǒng)一的,必須顯示指定每一個類型參數(shù)。

編程實驗:類模板的特化

#include <iostream> #include <string>using namespace std;template < typename T1, typename T2 > class Test { public:void add(T1 a, T2 b){cout << "void add(T1 a, T2 b)" << endl;cout << a + b << endl;} };template < typename T1, typename T2 > class Test < T1*, T2* > // 關于指針的特化實現(xiàn) { public:void add(T1* a, T2* b){cout << "void add(T1* a, T2* b)" << endl;cout << *a + *b << endl;} };template < typename T > class Test < T, T > // 當 Test 類模板的兩個類型參數(shù)完全相同時,使用這個實現(xiàn) { public:void add(T a, T b){cout << "void add(T a, T b)" << endl;cout << a + b << endl;}void print(){cout << "class Test < T, T >" << endl;} };template < > class Test < void*, void* > // 當 T1 == void* 并且 T2 == void* 時 { public:void add(void* a, void* b){cout << "void add(void* a, void* b)" << endl;cout << "Error to add void* param..." << endl;} };int main() { Test<int, float> t1;Test<long, long> t2;Test<void*, void*> t3;t1.add(1, 2.5);t2.add(5, 5);t2.print();t3.add(NULL, NULL);Test<int*, double*> t4;int a = 1;double b = 0.1;t4.add(&a, &b);return 0; }

4.3 重定義和特化的不同

重定義:

  • 一個類模板和一個新類(或者兩個類模板)。
  • 使用的時候需要考慮如何選擇的問題。

特化:

  • 以統(tǒng)一的方式使用類模板和特化類。
  • 編譯器自動優(yōu)先選擇特化類。

5 模板類的特殊用法

5.1 模板類遇到友元函數(shù)

#include <iostream>using namespace std;template <typename T> class A { public:A(T t=0);//聲明一個友元函數(shù),實現(xiàn)對兩個A類對象進行加法操作template <typename T>friend A<T> addA(const A<T> &a, const A<T> &b);/* 也可以寫成如下形式:friend A<T> addA <T>(const A<T> &a, const A<T> &b);*/T &getT();A operator +(const A &other);void print();private:T t; };template <typename T> A<T>::A(T t) {this->t = t; }template <typename T> T &A<T>::getT(){return t;}template <typename T> A<T> A<T>::operator+(const A<T> &other){A tmp; //類的內(nèi)部類型可以顯示聲明也可以不顯示tmp.t =this->t + other.t;return tmp;}template <typename T> void A<T>::print(){cout<<this->t<<endl; }//A 類的友元函數(shù),就是它的好朋友 template <typename T> A<T> addA(const A<T> &a, const A<T> &b){A<T> tmp;cout<<"call addA()..."<<endl;tmp.t = a.t + b.t;return tmp; }int main(void){A<int> a(666), b(888);//cout<<a.getT()<<endl;A<int> tmp = a + b;A<int> tmp1 = addA<int>(a, b);tmp.print();tmp1.print();system("pause");return 0; }

結論:
(1) 類內(nèi)部聲明友元函數(shù),必須寫成一下形式

template<typename T> friend A<T> addA (A<T> &a, A<T> &b);

(2) 友元函數(shù)實現(xiàn) 必須寫成

template<typename T>A<T> add(A<T> &a, A<T> &b) {//...... }

(3)友元函數(shù)調(diào)用 必須寫成A<int> c4 = addA<int>(c1, c2);。

5.2 類模板遇上靜態(tài)成員

#include <iostream>using namespace std;template <typename T> class A { public:A(T t=0);T &getT();A operator +(const A &other);void print();public:static int count; private:T t; };template <typename T> int A<T>::count = 666;template <typename T> A<T>::A(T t) {this->t = t; }template <typename T> T &A<T>::getT() {return t; }template <typename T> A<T> A<T>::operator+(const A<T> &other){A tmp; //類的內(nèi)部類型可以顯示聲明也可以不顯示tmp.t =this->t + other.t;return tmp; }template <typename T> void A<T>::print(){cout<<this->t<<endl; }/* //當我們的虛擬的類型T被 int 實例化以后,模板類如下: class A { public: A(int t=0);int &getT();A operator +(const A &other);void print();public: static int count; private: int t; };int A::count = 666;A::A(int t) { this->t = t; }int &A::getT() { return t; }A A::operator+(const A &other){ A tmp; //類的內(nèi)部類型可以顯示聲明也可以不顯示 tmp.t =this->t + other.t; return tmp; }void A::print(){ cout<<this->t<<endl; } *//* //當我們的虛擬的類型T被 float 實例化以后,模板類如下: class A { public: A(float t=0);float &getT();A operator +(const A &other);void print();public: static int count; private: float t; };int A::count = 666;A::A(float t) { this->t = t; }float &A::getT() { return t; }A A::operator+(const A &other){ A tmp; //類的內(nèi)部類型可以顯示聲明也可以不顯示 tmp.t =this->t + other.t; return tmp; }void A::print(){ cout<<this->t<<endl; } */int main(void){A<int> a(666), b(888);A<int> tmp = a + b;//A a(666), b(888);//A tmp = a + b;A<float> c(777), d(999);a.count = 888;cout<<"b.count:"<<b.count<<endl;cout<<"c.count:"<<c.count<<endl;cout<<"d.count:"<<d.count<<endl;c.count = 1000;cout<<"修改后, d.count:"<<d.count<<endl;//tmp.print();system("pause");return 0; }

總結:

  • 從類模板實例化的每個模板類有自己的類模板數(shù)據(jù)成員,該模板類的所有對象共享一個static數(shù)據(jù)成員。
  • 和非模板類的static數(shù)據(jù)成員一樣,模板類的static數(shù)據(jù)成員也應該在文件范圍定義和初始化。
  • static 數(shù)據(jù)成員也可以使用虛擬類型參數(shù)T。

參考資料:

  • C++深度解析教程
  • C/C++從入門到精通-高級程序員之路【奇牛學院】
  • 《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的C++中的类模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 中文字幕永久视频 | 少妇1~3伦理 | 歪歪视频在线观看 | 69天堂网| 久久久视频在线观看 | 日本少妇影院 | 在线免费视频一区 | 亲女禁h啪啪宫交 | 日本免费www | 色屁屁一区二区三区 | 亚洲精品日产精品乱码不卡 | 亚洲成人自拍偷拍 | 一本色综合 | 日本大胆欧美人术艺术 | 最新日韩中文字幕 | 亚洲欧美国产高清va在线播放 | 国产欧美视频在线观看 | a级黄色在线观看 | 先锋影音av资源在线 | 国产大片aaa | 欧美freesex黑人又粗又大 | 中文字幕亚洲在线观看 | 国产乱人乱偷精品视频 | 天天综合网久久综合网 | 男女被到爽流尿 | 日韩视频免费播放 | 奇米影视久久久 | 波多野结衣中文字幕在线播放 | 日韩精品在线免费视频 | 黄色小视频入口 | 久久伊人五月天 | 日韩av在线第一页 | 麻豆69xxnxxporn | 黄网站在线观 | 久久午夜av| 蜜桃tv一区二区三区 | 国产国拍精品亚洲 | 激情一区二区三区 | 中文字幕无人区二 | av片在线免费看 | 久久1234 | 国产色91 | 午夜福利电影一区 | 日本少妇吞精囗交视频 | 日批黄色片| 久久美女av | 欧美成网站 | 沟厕沟厕近拍高清视频 | 久草视频福利在线 | 亚洲免费大全 | 葵司有码中文字幕二三区 | 亚洲国产精品久久 | 成人免费激情视频 | 你懂的网址在线观看 | 大香焦久久 | 午夜福利三级理论电影 | 黄色一级免费视频 | 亚洲第一在线播放 | 多啪啪免费视频 | 日日艹 | 日本泡妞视频 | 国产精品自拍在线观看 | 亚洲七区 | 欧美区一区 | 影音先锋在线视频观看 | 波多野结衣在线观看视频 | 成人一级影片 | xxxx性视频 | 国产视频手机在线播放 | 精品人人妻人人澡人人爽牛牛 | 牛牛免费视频 | 四虎1515hh.com| 五月丁香综合激情六月久久 | 女人18毛片一区二区三区 | 久久久久二区 | 久久公开视频 | 玖玖爱av| 午夜精品久久久久久久久久久久久 | 欧美性猛交ⅹxx乱大交 | 午夜精品久久久内射近拍高清 | 福利视频免费观看 | 中国丰满人妻videoshd | 在线播放av网址 | 影音先锋丝袜制服 | 欧美日韩国产大片 | 青青草国产成人av片免费 | 日韩小视频网站 | 成av人片一区二区三区久久 | 久久亚洲精品视频 | 什么网站可以看毛片 | sese国产| 国产精品17p | 美女隐私无遮挡网站 | 亚洲天堂av在线免费观看 | 亚洲国产aⅴ精品一区二区的游戏 | 青娱网电信一区电信二区电信三区 | 久久久久亚洲av无码专区首jn | 精品伦精品一区二区三区视频密桃 | 91网国产|