【类模板】类模板的基本范式

一、类模板的概念

类模板与一般的模板一样,都是通过给定的模板参数,生成具体的类,也就是实例化一个特定的类。这个概念和函数模板差不多。
例如,在 C + + C++ C++中的 s t d : : v e c t o r std::vector std::vector容器就是一个经典的类模板,如 s t d : : v e c t o r < i n t > std::vector<int> std::vector<int>,其中 < i n t > <int> <int>表示实例化出一个 i n t int int类型的 v e c t o r vector vector容器。
引入类模板是十分必要的,具体如下:

在这里插入图片描述

二、类模板的基本范式

具体而言,类模板一般含有以下元素:

1.成员变量
2.成员函数
3.自定义类型表
4.构造函数和析构函数
5.运算符重载
6.迭代器接口

这里实现一个自定义的 m y v e c t o r myvector myvector容器,基本代码如下:

template<typename T>
class myvector {
public:
	//类型表
	typedef T* myiterator; //迭代器名称(指针)
public:
	//构造函数
	myvector() {};
	myvector(myvector const&){};

	//赋值运算符
	myvector& operator=(myvector const&); //也可以写成myvector<T>operator(myvector<T>const&)

public:
	//成员函数
	void myfunc();

	//静态成员函数
	static void my_static_func();

public:

	//迭代器接口 
	myiterator begin();
	myiterator end();
	
};

通常,在类内的函数可以不用添加 < T > <T> <T>类型名,可以省略。
而在类外实现的话就必须加上 t e m p l a t e < T > template<T> template<T>,并且函数名也要带上 < T > <T> <T>,如下,这里实现了静态函数和普通函数的类外实现:

//类外实现
template<typename T>
void myvector<T>::myfunc() { //类外实现需要补充参数<T>
	std::cout << "调用了myvector的成员函数\n";
}

template<typename T>
void myvector<T>::my_static_func() {
	std::cout << "调用了myvector的静态成员函数\n";
}

更多细节如下:

在这里插入图片描述

三、类模板的实例化

与函数模板不一样,类模板中的成员函数只有被调用的时候才会被实例化,其中构造函数在创建对象的时候被实例化调用。
我们可以用 d u m p b i n dumpbin dumpbin工具来查看是否实例化了类模板函数:

我们这里只创建类,而不调用类内函数

void Test() {
	myvector<int>vec;
	
}

可以发现:成功实例化了 m y v e c t o r < i n t > myvector<int> myvector<int>的构造函数,而没有实例化类内函数。
在这里插入图片描述

让我们在调用类内部的函数看看:

void Test() {
	myvector<int>vec;
	vec.myfunc();
	myvector<int>::my_static_func();
}

现在,我们实例化了三个函数:

1.构造函数
2.myfunc成员函数
3.my_static_func静态成员函数

具体如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值