第十天2017/04/21(2、泛型编程:模板 / 全特化、偏特化)
生活随笔
收集整理的這篇文章主要介紹了
第十天2017/04/21(2、泛型编程:模板 / 全特化、偏特化)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、什么是模板? template<class T1,class T2,.....>
類屬————類型參數(shù)化,又稱參數(shù)模板使得程序可以從邏輯功能上抽象,把被處理的對象(數(shù)據(jù))的類型作為參數(shù)傳遞。【1】函數(shù)模板
#include <iostream>
using namespace std;
//函數(shù)模板
template <class T1,class T2>
void show(T1 a,T2 b)
{cout<<a<<"+"<<b<<endl;
}int main()
{
//自動類型推導show(111,2.222);
//具體類型調(diào)用show<int,float>(111,2.222); //類型參數(shù)化
}
【注意】函數(shù)模板可以像普通函數(shù)一樣被重載函數(shù)模板不允許自動類型的轉(zhuǎn)換,普通函數(shù)可以進行自動類型轉(zhuǎn)換
【C++編譯器怎么實現(xiàn)函數(shù)模板的?】函數(shù)模板實現(xiàn)本質(zhì)探究!——編譯器并不是把函數(shù)模板處理成能夠處理任意類型的函數(shù)--編譯器從函數(shù)模板通過具體類型產(chǎn)生不同的函數(shù)--編譯器會對函數(shù)模板進行兩次編譯--在調(diào)用的地方對參數(shù)替換后的代碼進行編譯
換句話說:只不過是C++編譯器幫我們寫出了自己想要的函數(shù)而已!【2】類模板
知識1.類模板遇上繼承
#include <iostream>
using namespace std;
//類模板
template <class T1,class T2>
class A
{
public:void show(T1 a,T2 b);
};
template <class T1,class T2>
void A<T1,T2>::show(T1 a,T2 b)
{cout<<a<<"+"<<b<<endl;
}
//繼承類模板的語法:類A必須類型具體化為A<int,int>
class B:public A<int,int>
{
public:void show_B(int a,int b);
};
template <class T1,class T2>
void B::show_B(int a,int b)
{cout<<a<<"+"<<b<<endl;
}
int main()
{A<int,char> a; //必須把類模板具體化類型后,才能實例化a.show(1,'A');//繼承類模板B b;b.show_B(100,200);
}
知識2:類模板遇上友元函數(shù)在類模板中,如果有友元函數(shù),那么該友元函數(shù)的實現(xiàn)必須在類中進行(如果在類外實現(xiàn)不管用何種方式,都會編譯錯誤)。
#include <iostream>
using namespace std;template <class T>
class Complex
{
public:
//類的成員函數(shù)Complex(T r=0, T i=0);void print();
//類的友元函數(shù)friend Complex operator+(const Complex<T> &c1,const Complex<T> &c2){return Complex<T>(c1.real+c2.real,c1.imag+c2.imag);}friend ostream& operator<<(ostream& out,const Complex& c){out<<c.real<<"+"<<c.imag;return out;}
private:T real;T imag;
};
//成員函數(shù)
template<class T>
Complex<T>::Complex(T r=0,T i=0)
{real = r;imag =i;
}
//成員函數(shù)
template<class T>
void Complex<T>::print()
{cout<<real<<"+"<<imag<<endl;
}
int main()
{Complex<int> c1(1,1);Complex<int> c2(2,2);Complex<int> c3;c3 = c1+c2;c3.print();cout<<c3<<endl;return 0;
}
知識3:類模板遇上static靜態(tài)成員
//每一種類型A<int>、A<char>、A<float>對應自己各自的靜態(tài)成員
#include <iostream>
using namespace std;template<class T>
class A
{
public:A();static int get_count();~A();
private:static int count;
};
//下面是成員屬性的初始化、成員函數(shù)的實現(xiàn)
template<class T>
int A<T>::count = 0;template<class T>
A<T>::A()
{count++;
}template<class T>
int A<T>::get_count()
{return count;
}template<class T>
A<T>::~A()
{count--;
}int main()
{A<int> a1;A<int> a2;A<int> a3;cout<<A<int>::get_count()<<endl; //3個A<int>類型的對象
---------------------------------------------------------------A<char> aa1;A<char> aa2;cout<<A<char>::get_count()<<endl; //2個A<char>類型的對象
}
(函數(shù)/類模板)的(偏特化/全特化)
詳解見C++中的博客
總結(jié)
以上是生活随笔為你收集整理的第十天2017/04/21(2、泛型编程:模板 / 全特化、偏特化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第十天2017/04/21(1、函数指针
- 下一篇: 第十天2017/04/21(3、泛型编程