类模板可以有非通用类型参数: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