小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 My鏡像站 2011-12-26

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

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

  第一句話就是定義這個(gè)模板,注意其中的參數(shù)不再是1個(gè)了,而是2個(gè)。其中第一個(gè)參數(shù)就是一個(gè)模板的類型ElementType,表示數(shù)組a的類型;另外一個(gè)是整型變量n,眾所周知,它代表的是該數(shù)組a的長度。下面,我用一個(gè)比較難的程序來說明一下數(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;
}

  程序分析:

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

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

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

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

ElementType a[n];

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

int a[4];

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

array_2[i]=array_1[i];

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

array_2[0]=array_1[0];

  注意右邊的array_1[0],因?yàn)閍rray_1是一個(gè)對象而不是一個(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]的類型為ArrayTemplate類型,而a[0]的類型卻是整型,編譯器則會(huì)使用隱式類型轉(zhuǎn)換:

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

  將a[0]強(qiáng)制轉(zhuǎn)換為ArrayTemplate類型。這樣就會(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對象數(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語句之后的內(nèi)容,退出程序。

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

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多