C++语法学习笔记五十六:类模板概念,类模板定义、使用

实例代码:

// 

#include <iostream>
#include <vector>


using namespace std;

//定义类模板

template<typename T> //名字为T的模板参数,用来表示myvector这个容器所保存的元素类型。
class myvector{
public:
	typedef T* myiterator; //迭代器, vector iterator

public:
	myvector(); // 构造函数
	myvector& operator=(const myvector&); //赋值运算符重载。在类模板内部使用模板名并不需要提供模板参数。
	//myvector<T>& operator=(const myvector<T>&);

public:
	myiterator mybegin(); //迭代器的起始位置
	myiterator myend(); //迭代器的最后一个元素的下个位置

public:
	void myfunc();// {}; //把成员函数的函数体(函数具体实现)放在类模板的定义中。

};

//普通函数
template<typename T>
void myvector<T>::myfunc(){
	// ...
	return;
}

//构造函数
template<typename T>
myvector<T>::myvector(){

}

template<typename T>
myvector<T>& myvector<T>::operator=(const myvector&){ //<T>表示返回的是一个实例化了的myvector;
	return *this;
}


template<typename T, int size = 10>
class myarray{
private:
	T arr[size];
public:
	void myfunc();
};

template<typename T, int size>
void myarray<T,size>::myfunc()
{
	cout << size << endl;
	return;
}



int main()
{
	//一:概述,用类模板来实例化一个特定的类。
	//编译器不能为类模板推断模板参数类型,所以为了使用类模板,我们必须在模板名后边用<>来提供额外的信息,这些信息其实就是
	//对应着模板参数列表里边的这些参数。
	//vector<int> : 实现同一套代码,可以应付 不同的数据类型,这样就显得精简多了。


	//二:类模板定义
	//template<typename 形参名1, typename 形参名2, .... typename 形参名n>
	//class 类名
	//{ };


	//vector, myvector:
	//实例化类模板的时候,必须要有类的全部信息,包括类模板中成员函数的函数体;
	//创建一个myvector

	myvector<int> tmpvec; //这个时候,编辑器就给咱们生成了一个具体的类,
	myvector<double> tmpvec2;
	myvector<string> tmpvec3;
	//myvector 是类模板名,它不是一个类名,类模板是 用来实例化类(类型)用的。
	//所以myvector<double>, myvector<string>才是;类型名(实例化了的类型)。
	//所以,一个实例化了的类型  总会用尖括号<>包含着模板参数。


	//三:类模板的成员函数
	//类模板成员函数,可以写在类模板定义中{}, 那么这种写在类模板定义中的成员函数会被隐式声明为inline函数。
	//类模板一旦被实例化之后,那么这个模板的每个实例都会有自己版本的成员函数。
		//所以,类模板的成员函数具有和这个类模板相同的模板参数(这句话的核心意思:类模板的成员函数是有模板参数的);
	//如果你要把类模板成员函数的定义(函数体)写在类模板定义的外边,那么这个成员函数的模板参数就体现出来了。
	//定义在类模板之外的成员函数必须以关键字template开始,后边接类模板参数列表,
	//同时,在类名后边要用尖括号<>把模板参数列表里边的所有模板参数名列出来,如果是多个模板参数,用,分割。

	//一个类模板虽然可能有很多成员函数,但是,当你实例化模板之后,如果你后续没有使用到某个成员函数,则这个成员函数不会被实例化。
	//说白了,就是一个实例化的模板,它的成员函数只有在使用的时候才被实例化。


	//四:模板类名字的使用
	//五:非类型模板参数
	myarray<int, 100> tmparray;
	tmparray.myfunc(); // 100
	myvector<int> tmparray2;
	tmparray2.myfunc(); // 10


	//非类型模板参数有一些限制的;
	//(1) 浮点型不能做非类型模板参数。比如:float,double
	//(2) 类类型一般也不允许做非类型模板参数

	system("pause");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值