C++ 模板类的示例-数组

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

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值