#include<iostream>
using namespace std;
/*
oop三大特征
封装 继承 多态
第二部分 模版
《C++ templates》
1.函数模版
2.类模板
需要搞清楚的知识点
函数模版
模版的实例化,(显示, 隐式)
模版函数
模版的实参推演
模版类型参数
模版的非类型参数
模版的特例化(专用化)
模版函数的重载
*/
/*
int sum(int a,int b); a,b 实参的值进行参数化
模版就是将类型也进行参数化
*/
/*
*1*模版的代码内容实例化之前不进行编译
*2*因为1 ,所以当它没有任何的实例化(也就是没有产生任何函数),所以,对于模版的代码不能写到头文件里,
所以,在模版的调用处,一定要看到模版的定义处,光声明不可以
想在头文件里写,就必须显示实例化
*/
//语法:定义模版的参数列表 可定义 类型参数/非类型参数 class/typename
//template<class CT> //类类型
//template<typename T> //非类类型参数
//template<typename T1,typename T2>//可定义多个,一般都是大写
#if 1
/*
类模版
链表
*/
//前向声明
template<typename T>
class CLink;
//类模版 除了构造和析构函数的名字 可以省略参数列表(模版的参数列表<typename T>),其他地方不能省略
template<typename T> //Node<int>
class Node
{
public:
typedef int T;
Node(T data = T()):_data(data),_pnext(NULL){};
private:
T _data;
Node<T> *_pnext;
//template<typename T> //CLink<int> CLink<char> CLink<int *>
//friend class CLink;
friend class CLink<T>;//声明模版CLink,,T特例化,,要是用这个得在前面进行前向声明
};
//可以看出,不同模版的参数名可以用在不同模版出,也就是相同的模版参数名,不在同一作用域处就可以重名
template<typename T=int>
class CLink
{
public:
CLink()
{
_phead = new Node<T>();
}
~CLink()
{
Node<T> *pcur = _phead;
while(pcur != NULL)
{
_phead = _phead->_pnext;
delete pcur;
pcur = _phead;
}
}
void insertHead(const T &val);
void show()
{
Node<T> *pcur = _phead->_pnext;
while(pcur!=NULL)
{
cout<<pcur->_data<<" ";
<
using namespace std;
/*
oop三大特征
封装 继承 多态
第二部分 模版
《C++ templates》
1.函数模版
2.类模板
需要搞清楚的知识点
函数模版
模版的实例化,(显示, 隐式)
模版函数
模版的实参推演
模版类型参数
模版的非类型参数
模版的特例化(专用化)
模版函数的重载
*/
/*
int sum(int a,int b); a,b 实参的值进行参数化
模版就是将类型也进行参数化
*/
/*
*1*模版的代码内容实例化之前不进行编译
*2*因为1 ,所以当它没有任何的实例化(也就是没有产生任何函数),所以,对于模版的代码不能写到头文件里,
所以,在模版的调用处,一定要看到模版的定义处,光声明不可以
想在头文件里写,就必须显示实例化
*/
//语法:定义模版的参数列表 可定义 类型参数/非类型参数 class/typename
//template<class CT> //类类型
//template<typename T> //非类类型参数
//template<typename T1,typename T2>//可定义多个,一般都是大写
#if 1
/*
类模版
链表
*/
//前向声明
template<typename T>
class CLink;
//类模版 除了构造和析构函数的名字 可以省略参数列表(模版的参数列表<typename T>),其他地方不能省略
template<typename T> //Node<int>
class Node
{
public:
typedef int T;
Node(T data = T()):_data(data),_pnext(NULL){};
private:
T _data;
Node<T> *_pnext;
//template<typename T> //CLink<int> CLink<char> CLink<int *>
//friend class CLink;
friend class CLink<T>;//声明模版CLink,,T特例化,,要是用这个得在前面进行前向声明
};
//可以看出,不同模版的参数名可以用在不同模版出,也就是相同的模版参数名,不在同一作用域处就可以重名
template<typename T=int>
class CLink
{
public:
CLink()
{
_phead = new Node<T>();
}
~CLink()
{
Node<T> *pcur = _phead;
while(pcur != NULL)
{
_phead = _phead->_pnext;
delete pcur;
pcur = _phead;
}
}
void insertHead(const T &val);
void show()
{
Node<T> *pcur = _phead->_pnext;
while(pcur!=NULL)
{
cout<<pcur->_data<<" ";
<