類模板可以有非通用類型參數:1)通常是整型(C++20標準可以用其它的類型);2)實例化模板時必須用常量表達式;3)模板中不能修改參數的值;4)可以為非通用類型參數提供默認值。
優點:在棧上分配內存,易維護,執行速度快,合適小型數組。
缺點:在程序中,不同的非通用類型參數將導致編譯器生成不同的類。
構造函數的方法更通用,因為數據的大小是類的成員(而不是硬編碼),可以創建數組大小可變的類。
#include <iostream> // 包含頭文件。
using namespace std; // 指定缺省的命名空間。template <class T,int len=10>
class Array
{
private:T items[len]; // 數組元素。
public:Array() {} // 默認構造函數。~Array() {} // 析構函數T& operator[](int ii) { return items[ii]; } // 重載操作符[],可以修改數組中的元素。const T& operator[](int ii) const { return items[ii]; } // 重載操作符[],不能修改數組中的元素。
};template <class T>
class Vector
{
private:int len; // 數組元素的個數。T* items; // 數組元素。
public:// 默認構造函數,分配內存。Vector(int size=10):len(size) {items = new T[len];}~Vector() { // 析構函數delete[] items; items = nullptr;}void resize(int size) { // 護展數組的內存空間。if (size <= len) return; // 只能往更大擴展。T* tmp = new T[size]; // 分配更大的內存空間。for (int ii = 0; ii < len; ii++) tmp[ii] = items[ii]; // 把原來數組中的元素復制到新數組。delete[] items; // 釋放原來的數組。items = tmp; // 讓數組指針指向新數組。len = size; // 擴展后的數組長度。}int size() const { return len; } // 獲取數組長度。T& operator[](int ii) { // 重載操作符[],可以修改數組中的元素。if (ii >= len) resize(ii + 1); // 擴展數組。return items[ii]; }const T& operator[](int ii) const { return items[ii]; } // 重載操作符[],不能修改數組中的元素。
};int main()
{// Array<string,10> aa; // 創建模板類Array的對象。Vector<int> aa(1); // 創建模板類Vector的對象。aa[0] = 5; aa[1] = 8; aa[2] = 3; aa[3] = 2; aa[4] = 7; // aa[0] = "西施"; aa[1] = "冰冰"; aa[2] = "冪冪"; aa[3] = "金蓮"; aa[4] = "小喬";for (int ii=0; ii<5;ii++) cout << "aa[" << ii << "]=" << aa[ii] << endl;
}
推薦一個零聲學院項目課,個人覺得老師講得不錯,分享給大家:
零聲白金學習卡(含基礎架構/高性能存儲/golang云原生/音視頻/Linux內核)
https://xxetb.xet.tech/s/3Zqhgt