类模板—模板类的示例—数组

定长数组:array容器(C++11标准)

可变数组:vector容器。

类模板的非通用类型参数。

——————————————————————————————

创建一个简单的定长数组容器

#include<iostream>
using namespace std;
template <class T,int len>
class Array
{
private:
	T items[len];
public:
	Array() { memset(items, 0, sizeof(items)); }
	~Array(){}
	T& operator[](int ii){ return items[ii]; }
	const T& operator[](int ii)const { return items[ii]; }

};
int main() {
	Array<int,10>aa;
	aa[0] = 0, aa[1] = 1, aa[2] = 2, aa[3] = 3, aa[4] = 4;
	for (int ii = 0; ii < 5; ii++)cout << "aa[" << ii << "]=" << aa[ii] << endl;



	return 0;
}
aa[0]=0
aa[1]=1
aa[2]=2
aa[3]=3
aa[4]=4

C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 18292)已退出,代码为 0。
按任意键关闭此窗口. . .

但是如果把数组的数据类型改为字符串string,输出的就乱七八糟了

Array<string,10>aa;
//aa[0] = 0, aa[1] = 1, aa[2] = 2, aa[3] = 3, aa[4] = 4;
aa[0] = "a", aa[1] = "b", aa[2] = "c", aa[3] = "d", aa[4] = "e";
for (int ii = 0; ii < 5; ii++)cout << "aa[" << ii << "]=" << aa[ii] << endl;
aa[0]=
aa[1]=
aa[2]=p
aa[3]=P
aa[4]=`

C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 5048)已退出,代码为 0。
按任意键关闭此窗口. . .

原因是:string是类,里面有一个指向堆区内存的指针,所以不可以用memset()函数去初始化数组。

把memset那行删掉就好了。

#include<iostream>
using namespace std;
template <class T,int len>
class Array
{
private:
	T items[len];
public:
	Array() { //memset(items, 0, sizeof(items));
	}
	~Array(){}
	T& operator[](int ii){ return items[ii]; }
	const T& operator[](int ii)const { return items[ii]; }

};
int main() {
	Array<string,10>aa;
	//aa[0] = 0, aa[1] = 1, aa[2] = 2, aa[3] = 3, aa[4] = 4;
	aa[0] = "a", aa[1] = "b", aa[2] = "c", aa[3] = "d", aa[4] = "e";
	for (int ii = 0; ii < 5; ii++)cout << "aa[" << ii << "]=" << aa[ii] << endl;



	return 0;
}
aa[0]=a
aa[1]=b
aa[2]=c
aa[3]=d
aa[4]=e

C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 12552)已退出,代码为 0。
按任意键关闭此窗口. . .

数组不初始化不太好,办法肯定有,以后再说吧。

函数模板可以有非通用类型参数,类模板也可以。

template <class T,int len>
class Array
{
private:
	T items[len];

___________________________________
Array <string,10> aa;

刚才写到的。非通用类型参数可以有缺省值 :

template <class T,int len=10>
class Array
{
private:
	T items[len];

___________________________
Array <sting> aa;

________________________________________________________

模板类非通用参数有三个细节;

1.通常是整数(C++20也可以是其他)

2.创建对象的时候必须用常量表达式。

3.在类模板的代码中,不能修改非通用参数的值。

————————————————————————————————————————

创建一个简单的变长数组容器。

template <class T>
class Vector
{
private:
	int len;
	T* items[len];
public:
	Vector(int size):len(size) { 
		items = new T[len];
	}
	~Array() {
		delete[] items;
		items = nullptr;
	}

	T& operator[](int ii) { return items[ii]; }
	const T& operator[](int ii)const { return items[ii]; }

};

再给这个类加一个成员函数:如果数组太小,可以扩展;

#include<iostream>
using namespace std;

template <class T>
class Vector
{
private:
	int len;
	T* items;
public:
	Vector(int size):len(size) { 
		items = new T[len];
	}
	~Vector() {
		delete[] items;
		items = nullptr;
	}
	void resize(int size) {
		if (size <= len)return ;
		T* temp = new T[size];
		for (int i = 0; i < len; i++) {
			temp[i] = items[i];
		}
		delete[] items;
		items = temp;
		len = size;
	}
	int getlen()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() {
	Vector <string> aa(1);
	aa[0] = "a", aa[1] = "b", aa[2] = "c", aa[3] = "d", aa[4] = "e";
	for (int ii = 0; ii < 5; ii++)cout << "aa[" << ii << "]=" << aa[ii] << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值