C++模板

定义

模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

函数、结构体、类 模板的 定义样例

//函数模板---使用体现:调用函数时传递的参数类型。
template<class 数据类型参数标识符>
<返回类型><函数名>(参数表)
{
    函数体
}

//结构体模板---使用体现:声明结构元素时 StackNode<类型> s;
template<class T>
struct StackNode
{
  struct T data;
  struct StackNode<T> *next;
};

//类模板---使用体现:声明类对象时 Stack<类型> s;
template<class T>
class Stack
{
 public:
  T pop();
  bool push(T e);
 private:
  StackNode<T> *p;
}
template<class T>//类模板外的 成员函数实现
T Stack<T>::pop()
{...}

结构体模板

template<class T>
struct BiTree
{
    T data;
    BiTree<T> *lchild;
    BiTree<T> *rchild;
};
 
//******1***********
typedef BiTree<int> *PNode;
typedef BiTree<int> Node;
void main()
{
//使用typedef
PNode a;
Node b;
 
 
//未使用typedef
BiTree<char> one;
BiTree<char> *POne;
getchar();
}

函数模板

​ Template <class或者也可以用typename T>
​ 返回类型 函数名(形参表)
​ {//函数定义体 }

实例

#include <iostream>
 
using namespace std;
 
template <typename T>
void Swap(T& a, T& b)
{
    T tmp = a;
    a = b;
    b = tmp;
}
 
void main()
{
    int a = 10;
    int b = 20;
    Swap(a, b);	//自动推到调用
    //Swap<int>(a, b);//显示指定调用
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
 
    float c = 12.3;
    float d = 23.4;
 
    //Swap(c, d); //自动推到调用
    Swap<float>(c, d); //显示指定调用
    cout << "c = " << c << endl;
    cout << "d = " << d << endl;
    system("pause");
}

类模板

Template < class或者也可以用typename T >
     class类名{
	//类定义......
};

实例

	template<typename T1,typename T2>
	
	class myClass{
	private:
	     T1 I;
	     T2 J;
	public:
	     myClass(T1 a, T2 b);//Constructor
	     void show();
	};


​	
	//这是构造函数
	//注意这些格式
	template <typename T1,typename T2>
	myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}
	
	//这是void show();
	template <typename T1,typename T2>
	void myClass<T1,T2>::show()
	{
	     cout<<"I="<<I<<", J="<<J<<endl;
	}

非类型形参

  • 非类型模板形参:模板的非类型形参也就是内置类型形参,如template<class T, int a> class B{};其中int a就是非类型的模板形参。
  • **非类型模板的形参只能是整型,指针和引用,像double,String, String **这样的类型是不允许的。但是double &,double *,**对象的引用或指针是正确的。
template<class T,int MAXSIZE> class List{
      private:
         T elems[MAXSIZE];  
      public:
         Print(){ cout<<"The maxsize of list is"<<MAXSIZE; }
}
List<int,5> list;
list.Print();//打印"The maxsize of list is 5"

模板声明和定义分开

在.h文件里声明,在.cpp文件里定义,然后在main函数里包含.h头文件,这样会报链接错误。这是因为函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×