在線做抽獎網(wǎng)站營銷的四種方式
系列文章目錄
` 14.4.4 數(shù)組模板示例和非類型參數(shù)
提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 系列文章目錄
- 14.4.4 數(shù)組模板示例和非類型參數(shù)
14.4.4 數(shù)組模板示例和非類型參數(shù)
模板常用作容器類,這是因為類型參數(shù)的概念非常適合于將相同的存儲方案用于不同的類型。確實,為容器類提供可重用代碼是引入模板的主要動機,所以我們來看看另一個例子,深入探討模板設計和使用的其他幾個方面。具體地說,將探討一些非類型(或表達式)參數(shù)以及如何使用數(shù)組來處理繼承族。首先介紹一個允許指定數(shù)組大小的簡單數(shù)組模板。一種方法是在類中使用動態(tài)數(shù)組和構(gòu)造函數(shù)參數(shù)來提供元素數(shù)目,最后一個版本的 Stack模板采用的就是這種方法。另一種方法是使用模板參數(shù)來提供常規(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
請注意程序清單 14.17中的模板頭:
template <class T,int n>
關(guān)鍵字 class(或在這種上下文中等價的關(guān)鍵字 typename)指出T為類型參數(shù),int指出n的類型為 int。這種參數(shù)(指定特殊的類型而不是用作泛型名)稱為非類型(non-type)或表達式(expression)參數(shù)。假設有下面的聲明:
ArrayTP<double,12>eggweights;
這將導致編譯器定義名為 ArrayTP<double,12>的類,并創(chuàng)建一個類型為ArrayTP<double,12>的eggweight對象。定義類時,編譯器將使用double 替換 T,使用12替換 n。
表達式參數(shù)有一些限制。表達式參數(shù)可以是整型、枚舉、引用或指針。因此,doublem是不合法的,但 doublemm 和 doublepm 是合法的。另外,模板代碼不能修改參數(shù)的值,也不能使用參數(shù)的地址。所以,在 ArayTP模板中不能使用諸如 n++和&n等表達式。另外,實例化模板時,用作表達式參數(shù)的值必須
是常量表達式。與Stack中使用的構(gòu)造函數(shù)方法相比,這種改變數(shù)組大小的方法有一個優(yōu)點。構(gòu)造函數(shù)方法使用的是通過 new 和 delete 管理的堆內(nèi)存,而表達式參數(shù)方法使用的是為自動變量維護的內(nèi)存棧。這樣,執(zhí)行速度將更快,尤其是在使用了很多小型數(shù)組時。
表達式參數(shù)方法的主要缺點是,每種數(shù)組大小都將生成自己的模板。也就是說,下面的聲明將生成兩個獨立的類聲明:
ArrayTP<double,12>eggweights;ArrayTP<double,13>donuts;
但下面的聲明只生成一個類聲明,并將數(shù)組大小信息傳遞給類的構(gòu)造函數(shù):
Stack<int>eggs(12);
Stack<int>dunkers(13);
另一個區(qū)別是,構(gòu)造函數(shù)方法更通用,這是因為數(shù)組大小是作為類成員(而不是硬編碼)存儲在定義中的。這樣可以將一種尺寸的數(shù)組賦給另一種尺寸的數(shù)組,也可以創(chuàng)建允許數(shù)組大小可變的類。