c++模板
模板一般分函数模板与类模板
函数模板:
解决,不同数据进行同种操作时,可以给数据定义一个模板类型,以达到函数的通用性
基本语法
//模版函数定义
template <typename T> //定义模版类型名T
T test(T x){
return x;
}
test<int>();指定以int型替换T,不指定则系统会参数值自动判断;
计算绝对值函数:
#include <iostream> using namespace std; template <typename T> T abs(T temp) { temp = temp > 0 ? temp : -temp; return temp; } int main() { int i = 10; double d = -5.5; cout << abs<int>(i) << " " << abs<double>(d) << endl; return 0; }
通过函数模板,计算数值的绝对值,就不用重复为不同类型数据定义函数;
类模板
解决同一种类,定义不过数据,或,其成员函数对不同数据作相同处理;
类模板基本语法:
template <class T>
class abs
{
private:
int i;
T x;
public:
abs(T a, T b){}
}
类模板对象的创建:
abs <int> a;
abs <double> b;
使用例:
#include <iostream> using namespace std; template <class T> class Tes { private: T i; T j; public: Tes(T x = 0, T y = 0) { i = x; j = y; } T put() { return i * j; } ~Tes() {} }; int main() { Tes <int> a(2, 5); cout << a.put() <<endl; Tes <double> b(2.5, 5.5); cout << b.put() <<endl; return 0; }
成员函数外部定义方法:
基本形式:
template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体},
template<class T> void Tes<T>::add(参数列表){函数体},
#include <iostream> using namespace std; //定义模板类 template <class T> class Tes { private: T i; T j; public: Tes(T x = 0, T y = 0) { i = x; j = y; } T put() { return i * j; } T add(); ~Tes() {} }; //外部定义函数方法 template <class T> T Tes<T>::add() { return i + j; } //主函数 int main() { Tes <int> a(2, 5); cout << a.put() <<endl; cout << a.add() <<endl; Tes <double> b(2.5, 5.5); cout << b.put() <<endl; cout << b.add() <<endl; return 0; }
总结:
在类模板中,只要使用到类名的,后面就要有<>的存在;
结构体模板:(等效于类模板)
template <class T>
struct name
{
T data;
name * next;
}
//初始化一个结点
name<int> a;
最后模板的使用体现形式;
//函数模板---使用体现:调用函数时传递的参数类型。 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() {...}