中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

c++數組類模板的實現

發布時間:2020-09-07 10:57:34 來源:網絡 閱讀:281 作者:小溢 欄目:編程語言





1、預備知識


(1)模板參數不僅僅可以是類型參數,還可以是數值型參數。


如:

template

<typename T, int N>//int N就是數值型參數, 要注意這個int類型,因為這里要注意數值型參數的限制,下面有說數值型參數的限制。

void func()

{

T a[N];//使用模板參數來定義局部數組,模板的數值型參數來表示數組的大小。

}


func<double, 10>();//這樣進行使用,數值型參數,也就是第二個參數要是常量,因為這是數值型模板參數的限制造成的。


數值型模板參數的限制:變量不能最為模板參數,浮點數不能作為模板參數,類對象不能作為模板參數等。


本質:模板參數是在編譯階段被處理的單元,這點毋庸置疑,因為編譯器會首先對模板進行編譯,因此,在編譯階段必須準確無誤的唯一確定,變量是不能夠在編譯階段進行確定的,所以變量

不可以作為模板參數,浮點數因為在計算機的內存中是不精確的,所以C++中不允許浮點數作為模板參數。類對象也不能在編譯的時候進行唯一的確定,因為它其實就是一個變量,類的變量擺了。


(2)一道面試題,用你覺得最高效的方法求得1+到N的數值。


template

< int N >//數值型模板參數的函數類模板

class Sum

{

public:

static const int VALUE = Sum<N-1>::VALUE + N;

};


template

< >完全特化

class Sum< 1 >

{

static const int VALUE = 1;

};


int main(void)

{

cout << "1 + 2 + 3 + ... + 100 = " <<Sum<100>::VALUE <<endl;


return 0;

}


解釋:上面的程序中,類模板用的是數值型參數,這點從模板參數為int就可以看出來,所以我們使用的時候,直接傳遞數值就行。VALUE是const的,并且有初始化,所以在編譯階段就會取得

VALUE這個常量的值,將其放入符號表中,同時VALUE又被static修飾,所以是放在全局數據區的。當編譯器編譯到VALUE時,首先就會去獲取這個常量的值進而放入符號表中,但是編譯器發現

要想取得VALUE的值,首先要取得N-1的值,要想取得N-1的值,要先取得N-1-1的值,知道N為1的時候,編譯器發現有這個類的特化,所以就用了這個特化的類,VALUE的值為1,因為有遞歸規程,

所以在返回的時候,N不斷的又+1,每次+1都會將加完的值放到VALUE這個常量中,直到N變到了N為止,也就是又一直加到了N,最后VALUE的值就完全取得完畢了,最后放入了符號表中。

這是一個高效的求和方法。因為編譯器在編譯的時候,這個VALUE的常量值就已經確定了,我們后面cout去訪問這個值的時候,只是相當于直接從符號表中將值取出來,所以高效。

這個高效的方法依賴了類模板技術、類模板完全特化技術、還依賴了類模板參數為數值型參數的技術,還依賴了對const和static的理解。有了static才可以用作用域分辨符去訪問這個VALUE,

有了const才會在編譯階段將值確定,因為常量的值是在編譯階段確定的。


向AI問一下細節

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

AI

酒泉市| 容城县| 鹤庆县| 五寨县| 浙江省| 山阴县| 梓潼县| 嘉定区| 潞西市| 光山县| 唐山市| 焦作市| 宜君县| 邯郸市| 清丰县| 梅州市| 洱源县| 巴楚县| 灯塔市| 谷城县| 阳新县| 桑日县| 华宁县| 宁蒗| 石嘴山市| 常宁市| 都匀市| 同心县| 清徐县| 台湾省| 深水埗区| 天峻县| 台东县| 泸水县| 临城县| 织金县| 赣州市| 安图县| 香格里拉县| 固镇县| 武川县|