在線做抽獎(jiǎng)網(wǎng)站營(yíng)銷的四種方式
系列文章目錄
` 14.4.4 數(shù)組模板示例和非類型參數(shù)
提示:寫(xiě)完文章后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
文章目錄
- 系列文章目錄
- 14.4.4 數(shù)組模板示例和非類型參數(shù)
14.4.4 數(shù)組模板示例和非類型參數(shù)
模板常用作容器類,這是因?yàn)轭愋蛥?shù)的概念非常適合于將相同的存儲(chǔ)方案用于不同的類型。確實(shí),為容器類提供可重用代碼是引入模板的主要?jiǎng)訖C(jī),所以我們來(lái)看看另一個(gè)例子,深入探討模板設(shè)計(jì)和使用的其他幾個(gè)方面。具體地說(shuō),將探討一些非類型(或表達(dá)式)參數(shù)以及如何使用數(shù)組來(lái)處理繼承族。首先介紹一個(gè)允許指定數(shù)組大小的簡(jiǎn)單數(shù)組模板。一種方法是在類中使用動(dòng)態(tài)數(shù)組和構(gòu)造函數(shù)參數(shù)來(lái)提供元素?cái)?shù)目,最后一個(gè)版本的 Stack模板采用的就是這種方法。另一種方法是使用模板參數(shù)來(lái)提供常規(guī)數(shù)組的大小,C++11新增的模板 array 就是這樣做的。程序清單 14.17 演示了如何做。
程序清單 14.17arraytp.h
//arraytp.h -- Array Template
#ifndef ARRAYTP_H_
#define ARRAYTP_H_#include <iostream>
#include <cstdlib>template <class T, int n>
class ArrayTP
{
private:T ar[n];
public:ArrayTP() {};explicit ArrayTP(const T & v);virtual T & operator[](int i);virtual T operator[](int i) const;
};template <class T, int n>
ArrayTP<T,n>::ArrayTP(const T & v)
{for (int i = 0; i < n; i++)ar[i] = v;
}template <class T, int n>
T & ArrayTP<T,n>::operator[](int i)
{if (i < 0 || i >= n){std::cerr << "Error in array limits: " << i<< " is out of range\n";std::exit(EXIT_FAILURE);}return ar[i];
}template <class T, int n>
T ArrayTP<T,n>::operator[](int i) const
{if (i < 0 || i >= n){std::cerr << "Error in array limits: " << i<< " is out of range\n";std::exit(EXIT_FAILURE);}return ar[i];
}#endif
請(qǐng)注意程序清單 14.17中的模板頭:
template <class T,int n>
關(guān)鍵字 class(或在這種上下文中等價(jià)的關(guān)鍵字 typename)指出T為類型參數(shù),int指出n的類型為 int。這種參數(shù)(指定特殊的類型而不是用作泛型名)稱為非類型(non-type)或表達(dá)式(expression)參數(shù)。假設(shè)有下面的聲明:
ArrayTP<double,12>eggweights;
這將導(dǎo)致編譯器定義名為 ArrayTP<double,12>的類,并創(chuàng)建一個(gè)類型為ArrayTP<double,12>的eggweight對(duì)象。定義類時(shí),編譯器將使用double 替換 T,使用12替換 n。
表達(dá)式參數(shù)有一些限制。表達(dá)式參數(shù)可以是整型、枚舉、引用或指針。因此,doublem是不合法的,但 doublemm 和 doublepm 是合法的。另外,模板代碼不能修改參數(shù)的值,也不能使用參數(shù)的地址。所以,在 ArayTP模板中不能使用諸如 n++和&n等表達(dá)式。另外,實(shí)例化模板時(shí),用作表達(dá)式參數(shù)的值必須
是常量表達(dá)式。與Stack中使用的構(gòu)造函數(shù)方法相比,這種改變數(shù)組大小的方法有一個(gè)優(yōu)點(diǎn)。構(gòu)造函數(shù)方法使用的是通過(guò) new 和 delete 管理的堆內(nèi)存,而表達(dá)式參數(shù)方法使用的是為自動(dòng)變量維護(hù)的內(nèi)存棧。這樣,執(zhí)行速度將更快,尤其是在使用了很多小型數(shù)組時(shí)。
表達(dá)式參數(shù)方法的主要缺點(diǎn)是,每種數(shù)組大小都將生成自己的模板。也就是說(shuō),下面的聲明將生成兩個(gè)獨(dú)立的類聲明:
ArrayTP<double,12>eggweights;ArrayTP<double,13>donuts;
但下面的聲明只生成一個(gè)類聲明,并將數(shù)組大小信息傳遞給類的構(gòu)造函數(shù):
Stack<int>eggs(12);
Stack<int>dunkers(13);
另一個(gè)區(qū)別是,構(gòu)造函數(shù)方法更通用,這是因?yàn)閿?shù)組大小是作為類成員(而不是硬編碼)存儲(chǔ)在定義中的。這樣可以將一種尺寸的數(shù)組賦給另一種尺寸的數(shù)組,也可以創(chuàng)建允許數(shù)組大小可變的類。