1. 程式人生 > >函式模版和模版函式,類模版和模版類的區別

函式模版和模版函式,類模版和模版類的區別

什麼是函式模板和類模板
函式模板是一種抽象函式定義,它代表一類同構函式 。通過使用者提供的具體引數, C++編譯器在編譯時刻能夠將函式模板例項化,根據同一個模板創建出不同的具體函式 ,這些函式之間的不同之處主要在於 函式內部一些資料型別 的不同,而由模板建立的函式的使用方法與一般函式的使用方法相同。函式模板的定義格式如下:
         templateFunction_Definition
其中,Function_Definition為函式定義;TYPE_LIST被稱為型別引數表,是由—系列代表型別的識別符號組成的,其間用逗號分隔,這 些識別符號的通常風格是由大寫字母組成,ARG_LIST稱為變量表,其中含有由逗號分隔開的多個變數說明,相當於一般函式定義中的形式引數。前面例題中的 max就是函式模板的一個例子,因此這裡不再另外舉例。

C++提供的類模板是一種更高層次的抽象的類定義
,用於使用相同程式碼建立不同類模板的定義與函式模板的定義類似,只是把函式摸板中的函式定義部分換作類說明,並對類的成員函式進行定義即可。在類說明中可以使用出現在TYPE_LIST中的各個型別標識以及出現在ARG_LIST中的各變數。
1       template<模版引數表>
2       class<類模板名>
3       {<類模板定義體>},

例如我們需要定義一個表示平面的點(Point)類,這個類有兩個成員變數分別表示橫座標和縱座標,並且這兩個座標的型別可以是int、float、 double等等型別。因此可能寫出類似Point_int_int、Point_float_int、Point_float_float等這樣的類。 通過類模板,我們只需要寫一個類。
1 #include 
2 using namespace std;
3      
4 template 
5 class Point_T
6 {
7 public:
8    T1 a;                 //成員a為T1型別
9    T2 b;                 //成員b為T2型別
10   Point_T() : a(0), b(0) {} //預設建構函式
11   Point_T(T1 ta, T2 tb) : a(ta), b(tb) {}   //帶引數的建構函式
12   Point_T& operator=(Point_T &pt); //賦值函式
13   friend Point_T operator +(Point_T &pt1, Point_T &pt2); //過載+
14 };
15    
16   template 
17   Point_T& Point_T::operator=(Point_T &pt) //賦值函式
18     {
19              this->a = pt.a; 
20              this->b = pt.b;
21              return *this;
22     }
23    
24 template 
25 Point_T operator +(Point_T &pt1, Point_T &pt2) //過載+
26     {
27       Point_T temp;
28       temp.a = pt1.a + pt2.a; //結果物件中的a和b分別為兩個引數物件的各自a和b之和
29       temp.b = pt1.b + pt2.b;
30       return temp;
31     }
32    
33 template 
34 ostream& operator << (ostream& out, Point_T& pt) //過載輸出流操作符
35     {
36              out << "(" << pt.a << ", ";                          //輸出(a, b)
37              out << pt.b << ")";
38              return out;
39     }
40    
41     int main()
42     {
43       Point_T intPt1(1, 2);       //T1和T2都是int
44        Point_T intPt2(3, 4);    //T1和T2都是int
45      Point_T floatPt1(1.1f, 2.2f);   //T1和T2都是float
46      Point_T floatPt2(3.3f, 4.4f);   //T1和T2都是float
47             
48      Point_T intTotalPt;
49      Point_T floatTotalPt;
50    
51     intTotalPt = intPt1 + intPt2;//型別為Point_T的物件相加
52     floatTotalPt = floatPt1 + floatPt2;   //型別為Point_T的物件相加
53    
54    cout << intTotalPt << endl; //輸出Point_T的物件
55    cout << floatTotalPt << endl; //輸出Point_T的物件
56    
57    return 0;
58     }
Point_T類就是一個類模板,它的成員a和b分別為T1和T2型別,這裡我們還實現了它的建構函式、賦值函式、“+”運算子的過載以及輸出流操作符“<<”的過載。
使用Point_T類非常方便,我們可以進行各種型別的組合。
程式碼43、44行,定義了兩個Point_T類的物件intPt1和intPt2,表明這兩個物件的成員a和b都是int型別。
程式碼45、46行,定義了兩個Point_T類的物件floatPt1和floatPt2,表明這兩個物件的成員a和b都是float型別。
程式碼51行,對intPt1和intPt2進行物件加法,結果儲存到intTotalPt中,此過程先呼叫“+”函式,再呼叫了“=”函式。
程式碼52行,與51行類似,只是相加的物件和結果物件都是Point_T類的物件。
程式碼54、55行,輸出物件intTotalPt和floatTotalPt的內容。
可以看出,通過使用類模板Point_T我們可以建立不同的類,大大提高了程式碼的可維護性以及可重用性。

有一些概念需要區別:函式模板與模板函式,類模板和模板類是不同的意思

函式模板的重點是模板,它表示的是一個模板,用來生產函式。例如前面例題的max是一個函式模板。 而模板函式的重點是函式,它表示的是由一個模板生成而來的函式。例如max,max等都是模板函式。
類模板和模板類的區別與上面的類似,類模板用於生產類,例如Point_T就是一個類模板。 而模板類是由一個模板生成而來的類,例如Point_T和Point_T都是模板類。

函式模板和類模板有什麼區別?
在面試例題1的程式程式碼中,我們在使用函式模板max時不一定要必須指明T的型別,函式模板max的例項化是由編譯程式在處理函式呼叫時自動完成的,當調 用max(1, 2)時自動生成例項max,而呼叫max(1.1f, 2.2f)時自動生成例項max。當然也可以顯示指定T的型別。
對於本例題的類模板Point_T來說,其例項化必須被顯示地指定,比如Point_T、Point_T。
答案:

函式模板是一種抽象函式定義,它代表一類同構函式。類模板是一種更高層次的抽象的類定義。
函式模板的例項化是由編譯程式在處理函式呼叫時自動完成的,而類模板的例項化必須由程式設計師在程式中顯式地指定。
類模板不能巢狀(區域性類模板)。   
類模板中的靜態成員僅屬於例項化後的類(模板類),不同例項之間不存在共享。