电竞比分网-中国电竞赛事及体育赛事平台

分享

“模板”學(xué)習(xí)筆記(7)

 My鏡像站 2011-12-26

  我們可以定義一個(gè)數(shù)組模板,并且利用該模板聲明其數(shù)組成員。聲明的方式非常簡(jiǎn)單,主需要一下兩步:

1
2
template<class ElementType,int n>;
ElementType a[n];

  第一句話(huà)就是定義這個(gè)模板,注意其中的參數(shù)不再是1個(gè)了,而是2個(gè)。其中第一個(gè)參數(shù)就是一個(gè)模板的類(lèi)型ElementType,表示數(shù)組a的類(lèi)型;另外一個(gè)是整型變量n,眾所周知,它代表的是該數(shù)組a的長(zhǎng)度。下面,我用一個(gè)比較難的程序來(lái)說(shuō)明一下數(shù)組模板的作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
using namespace std;
template<class ElementType,int n>
class ArrayTemplate
{
public:
    ArrayTemplate();
    ArrayTemplate(const ElementType &t);
    ElementType& operator[](int i);
    void show();
private:
    ElementType a[n];
};
template<class ElementType,int n>
ArrayTemplate<ElementType,n>::ArrayTemplate()
{
    cout<<"執(zhí)行不帶參數(shù)的構(gòu)造函數(shù)\n";
    for (int i=0;i<n;i++)
    {
        a[i]=(i+1);
    }
}
template<class ElementType,int n>
ArrayTemplate<ElementType,n>::ArrayTemplate(const ElementType &t)
{
    cout<<"執(zhí)行帶一個(gè)參數(shù)的構(gòu)造函數(shù)\n";
    for (int i=0;i<n;i++)
    {
        a[i]=t;
    }
}
template<class ElementType,int n>
ElementType& ArrayTemplate<ElementType,n>::operator[](int i)
{
    cout<<"執(zhí)行下標(biāo)運(yùn)算符函數(shù)operator[]\n";
    if (i<0||i>=n)
    {
        cout<<"超出數(shù)組的限制,程序終止!\n";
        exit(EXIT_FAILURE);
    }
    return a[i];
}
template<class ElementType,int n>
void ArrayTemplate<ElementType,n>::show()
{
    for(int i=0;i<n;i++)
    {
        cout<<"a["<<i<<"]="<<a[i]<<"\t";
    }
    cout<<endl;
}
int main()
{
    ArrayTemplate<int,4>array_1;
    array_1.show();
    ArrayTemplate<int,4>*array_2=new ArrayTemplate<int,4>[4];
    for(int i=0;i<9;i++)
    {
        array_2[i]=array_1[i];
        array_2[i].show();     
    }
    return 0;
}

  程序分析:

      首先我們?cè)诔绦虻牡?行定義了一個(gè)數(shù)組模板,其類(lèi)型為ElementType,數(shù)組長(zhǎng)度為n。然后我們?cè)陬?lèi)ArrayTemplate中于第7行聲明了一 個(gè)不帶參數(shù)的構(gòu)造函數(shù),定義在第15行;再在第8行重新聲明了一個(gè)帶一個(gè)參數(shù)的構(gòu)造函數(shù),定義在第行。在程序的第9行我們重載了[]運(yùn)算符。這里注意一 下,我們?cè)谀0孱?lèi)的外面定義類(lèi)中的函數(shù)的時(shí)候,應(yīng)該有三點(diǎn)注意事項(xiàng):

  1. 必須在函數(shù)前面重新聲明一下模板,如程序的第14行所示;
  2. 要想調(diào)用模板類(lèi)中的函數(shù),不能直接寫(xiě)上類(lèi)名::函數(shù)(),而是要在模板類(lèi)之后加上模板定義,如15行所示,這樣一來(lái),編譯器就會(huì)知道函數(shù)()是來(lái)自模板函數(shù)的了;
  3. 注意程序第33行的重載運(yùn)算符operator函數(shù)的定義。我們?cè)谝婚_(kāi)始應(yīng)該先加上“模板類(lèi)型&”,其次和定義其他模板函數(shù)類(lèi)似,千萬(wàn)不能漏掉“模板類(lèi)型&”。

      下面,我們從主函數(shù)開(kāi)始進(jìn)行分析...

      首先在第54行我們調(diào)用模板類(lèi)創(chuàng)建了一個(gè)array_1的類(lèi)型。它其中的變量為int型,然后數(shù)組元素一共有4個(gè)。這樣一來(lái),就表示在模板類(lèi)ArrayTemplate中的的私有成員變量

ElementType a[n];

  實(shí)際上就成為了以下的形式:

int a[4];

  這樣一來(lái),在程序第55行調(diào)用show()函數(shù)的時(shí)候,for循環(huán)的次數(shù)就會(huì)限定為4次(因?yàn)閚=4),這樣就會(huì)輸出由模板類(lèi)對(duì)象 array_1創(chuàng)建的4個(gè)數(shù)組a[0]、a[1]、a[2]、a[3]的值。然后我們?cè)賮?lái)看看程序的第56行,這里在堆中創(chuàng)建了4個(gè)對(duì)象,并把這4個(gè)對(duì)象 放在一個(gè)數(shù)組中,這個(gè)數(shù)組就是array_2。由于這個(gè)數(shù)組中間存放的全部都是對(duì)象,那么我們就把a(bǔ)rray_2叫做對(duì)象數(shù)組。后面的for循環(huán)中我們首 先來(lái)看看程序第59行的語(yǔ)句:

array_2[i]=array_1[i];

  當(dāng)i=0的時(shí)候這句話(huà)就相當(dāng)于

array_2[0]=array_1[0];

  注意右邊的array_1[0],因?yàn)閍rray_1是一個(gè)對(duì)象而不是一個(gè)數(shù)組,那么編譯器就會(huì)調(diào)用我們自己在程序的第33行定義的重載[]運(yùn) 算符的函數(shù)。它返回的就是array_1中的數(shù)組a[i]的值。在這里,因?yàn)閕=0,所以返回值就是a[0]。而我們從上面可以看到,a[0]=1所以相 當(dāng)于返回1。而特別注意的是array_2[0]的類(lèi)型為ArrayTemplate類(lèi)型,而a[0]的類(lèi)型卻是整型,編譯器則會(huì)使用隱式類(lèi)型轉(zhuǎn)換:

array_2[0]=ArrayTemplate(a[0]);

  將a[0]強(qiáng)制轉(zhuǎn)換為ArrayTemplate類(lèi)型。這樣就會(huì)調(diào)用位于程序第24定義的帶一個(gè)參數(shù)的構(gòu)造函數(shù)。在這個(gè)構(gòu)造函數(shù)中,我們將 a[0]的值作為t值傳遞進(jìn)去,然后再for循環(huán)中將a[0]到a[3]的值全部賦值為t(即a[0],也就是1)。值得注意的一點(diǎn)就在于,這里t代表的 a[0]是array_1的數(shù)組,而4次循環(huán)中的a[i]代表的是array_2對(duì)象數(shù)組中array_2[0]中的a[0]到a[3]的值!!所以會(huì)輸 出1,1,1,1也就不足為奇了。同理,后面的輸出分析方法同前面一樣。只有一點(diǎn),當(dāng)主程序的for循環(huán),循環(huán)到i=4的時(shí)候。這時(shí),就會(huì)執(zhí)行 operator[]函數(shù)中的if語(yǔ)句之后的內(nèi)容,退出程序。

      整個(gè)程序的輸出證明了我們的理論:

OK,這個(gè)比較難的程序搞定了,也就標(biāo)志了這個(gè)方面的模板應(yīng)用學(xué)習(xí)完了,^_^,繼續(xù)努力!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多