亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++泛型編程是什么

發布時間:2021-10-15 16:17:21 來源:億速云 閱讀:144 作者:柒染 欄目:編程語言

這期內容當中小編將會給大家帶來有關C++泛型編程是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

泛型編程與面向對象編程的目標相同,即使重用代碼和抽象通用概念的技術更加簡單。但是面向對象編程強調編程的數據方面,泛型編程強調的是獨立于特定數據類型。

介紹一下 C++ 編程中與面向對象并列的另一大分支——泛型編程,主要介紹函數模板、類模板和成員模板三大部分

泛型編程

模板是泛型編程的一種重要思想,STL(Standard Template Library,標準模板庫)是采用模板實現的一個實例函數模板

對比函數重載(同一作用域內函數名相同,參數列表不同的函數),函數模板只需要一個函數就實現了函數重載的部分功能(參數個數相同類型不同,函數重載需要定義多個同名參數列表不同的函數)

template<typename T, typename Y> // 這也可以寫 template<class T, class Y> 此處的 class 和 typename 作用相同void tfunc(T& t, Y& y) { cout << t << " " << y << endl;}int n = 2;double d = 2.1;tfunc(n, d);// 運行結果:2 2.1

函數模板具體化,函數模板具體化就是將某一(某幾)個要處理的類型單獨處理,需要單獨寫一個實現,形式是 template<> void fun(type& t);,函數模板的具體化和普通函數可以同時存在,調用順序是 普通函數 > 函數模板具體化 > 模板函數

// ====== 測試一:函數模板針對特殊數據類型具體化 ======struct Node { int val; Node* next;};// 函數模板template<typename T> void tfunc(const T& t) { cout << "template: " << t << endl;}// 函數模板具體化(用于處理Node類型數據)template<> void tfunc<Node>(const Node& node) { cout << "template<Node>: " << node.val << endl;}// 函數模板具體化(用于處理int類型數據)template<> void tfunc<int>(const int& n) { cout << "template<int>: " << n << endl;}// 普通函數void tfunc(const int& n) { cout << "tfunc(): " << n << endl;}double d = 2.1;tfunc(d); // 函數模板未具體化double類型函數,調用模板Node node{ 2, nullptr };tfunc(node); // 函數模板具體化Node類型函數,調用函數模板的具體化int n = 2;tfunc(n); // 函數模板具體化int類型函數,也存在普通函數,調用普通函數// ====== 測試二:函數模板部分具體化 ======template<typename T1, typename T2>void tfunc(T1 t1, T2 t2) { cout << typeid(T1).name() << " and " << typeid(T2).name() <<": " << t1 << " " << t2 << endl;}template<typename T1>void tfunc(T1 t1, int i) { cout << typeid(T1).name() << " and " << "int: " << t1 << " " << i << endl;}template<typename T2>void tfunc(long l, T2 t2) { cout << "long and " << typeid(T2).name() << ": " << l << " " << t2 << endl;}template<>void tfunc(short l, int i) { cout << "long and int: " << l << " " << i << endl;}// 分別調用以上四個模板函數tfunc(char('c'), char('c'));tfunc(char('c'), int(10));tfunc(long(10), char('c'));tfunc(short(10), int(10));

函數模板實例化,讓編譯器生成指定類型的函數定義,不用寫函數的實現,形式是 template void fun(type& t);

// 函數模板template<typename T> void tfunc(const T& t) { cout << "template: " << t << endl;}// 函數模板實例化,不用寫函數的實現,編譯器會生成該類型的模板具體化函數template void tfunc<char>(const char& c);

類模板

類模板可以指定默認模板參數(函數模板不可以),跟函數參數的默認值一樣,必須從右向左連續賦值默認類型,如果實例化對象時又傳遞了類型,默認類型會被覆蓋掉,跟函數參數是一樣的創建對象時需要傳遞模板參數列表,模板參數列表加在類名后面 ClassName< typename T > classN; 如果類的模板參數列

表有默認值,可以不傳模板參數,但一定要加 <> 如 ClassName< > classN; 創建堆區對象的時候,所有的類名稱后面都要加模板參數列表,如 ClassName< typename T >* classN = new ClassName< typename T>; 除了類內,其他地方出現 ClassName 的地方一般都要加模板參數列表

template<typename T = int, typename Y = char> // 此處指定了模板默認參數,部分指定必須從右到左指定class Test {public: Test(T t, Y y) : t(t), y(y) { } void tfunc();private: T t; Y y;};template<typename T, typename Y> // 類模板的函數在類外實現,需要加上模板參數列表,但不需要加指定的默認模板參數void Test<T, Y>::tfunc() { // 類外使用Test需要加模板參數 cout << t << " " << y << endl;}int n = 2;double d = 2.1;Test<int, double> test(n, d); // 此處如果使用默認模板參數可定義為 Test<> test(int(2), char('a'));test.tfunc();// 運行結果:2 2.1

類模板的繼承,類模板被繼承后參數的傳遞方式主要有兩種,一種是直接在子類繼承父類的時候,為父類指定固定的類型,二是通過子類模板參數列表傳遞

// ====== 測試一 ======template<typename T, typename Y>class A {public: A(T t, Y y) { }};class Test : public A<int, double> { // 父類是類模板,子類是普通類public: Test() : A<int, double>(2, 2.1) { }};Test();// ====== 測試二 ======template<typename T, typename Y>class A {public: A(T t) { }};template<typename X, typename Z, typename P>class Test : public A<X, P> {public: Test(X x, Z z, P p) : A<X, P>(x) { }};Test<int, double, char>(int(2), double(2.1), char('a'));

類模板的多態,在創建對象時,分為子類沒有模板(CFather<short, char>*cf = new CSon;)和子類有模板(CFather<short, char> *cf = new CSon<short, int, char>)兩種,子類和父類的模板參數列表可以不一樣,但一定要對應好

// ====== 測試一 ======template<typename T, typename Y> class A {public: virtual void tfunc(T t, Y y) = 0;};class Test : public A<int, double> { public: virtual void tfunc(int n, double d) { cout << n << " " << d << endl; }};// 父類是類模板,子類是普通類,在多態情況下父類需要指定模板參數,子類就不用了A<int, double>* a = new Test;a->tfunc(2, 2.1);// 運行結果:2 2.1// ====== 測試二 ======template<typename T, typename Y> class A {public: virtual void tfunc(T t, Y y) = 0;};template<typename X, typename Z, typename P>class Test : public A<X, P> {public: virtual void tfunc(X x, P p) { cout << x << " " << p << endl; }};// 父類是類模板,子類是類模板,在多態情況下父類和子類都需要指定模板參數A<int, double>* a = new Test<int, char, double>;a->tfunc(2, 2.1);// 運行結果:2 2.1

類模板具體化,類模板的具體化分為部分具體化和全部具體化兩種

template<typename T1, typename T2>class Test {public: Test() { cout << "T1 and T2" << endl; }};// 部分具體化template<typename T1>class Test<T1, int> {public: Test() { cout << "T1 and int" << endl; }};// 部分具體化template<typename T2>class Test<long, T2> {public: Test() { cout << "long and T2" << endl; }};// 全部具體化template<>class Test<long, int> {public: Test() { cout << "long and int" << endl; }};// 分別創建上面四個類Test<char, char>();Test<char, int>();Test<long, char>();Test<long, int>();

成員模板

成員模板簡單說就是模板中的模板

class Base1 { };class Base2 { };class Test1 : public Base1 { };class Test2 : public Base2 { };template<typename T1, typename T2> class Pair {public: T1 t1; T2 t2; Pair(T1 t1, T2 t2) : t1(t1), t2(t2) { } // 類模板中的成員模板 template<typename U1, typename U2> Pair(const Pair<U1, U2>& pair) : t1(pair.t1), t2(pair.t2){ }};Pair<Base1*, Base2*>(Pair<Test1*, Test2*>(new Test1, new Test2));

如果未特殊說明,以上測試均是在win10 vs2017 64bit編譯器下進行的

上述就是小編為大家分享的C++泛型編程是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

东源县| 青浦区| 库尔勒市| 乌恰县| 巴林左旗| 孝感市| 泗洪县| 特克斯县| 樟树市| 隆化县| 延川县| 克山县| 都昌县| 宜丰县| 武川县| 辽宁省| 邵阳县| 孟村| 青铜峡市| 深泽县| 灵寿县| 兴仁县| 会东县| 唐河县| 山西省| 神池县| 四会市| 东台市| 邯郸县| 内乡县| 承德县| 武冈市| 喀什市| 淮南市| 麻栗坡县| 南平市| 盈江县| 三明市| 博爱县| 榆林市| 台东市|