C++模板和泛型
目录
[TOC]
一句话说清泛型程序设计
算法在实现时不指定具体数据类型。目的是实现代码的重用。泛型设计最成功的应用就是C++的标准模板库(STL),可以说泛型设计就是对模板的设计和使用。
函数模板(核心:类型的参数化)
函数模板语法
template<typename T1, typename T2...> 返回值类型 函数名(形参列表){
//函数体,可以使用类型参数
}
模板头template<typename T>
和函数的定义以及声明都是不可分的整体,在使用模板函数时不用加模板头。
函数模板示例
template<typename T> void swap(T &a,T &b){
T temp;
temp = a;
a = b;
b = temp;
}
//main函数内部
int i1=10,i2=20;
swap(i1,i2);//T作为int
float f1=0.1,f2=1.1;
swap(f1,f2);//T作为float
typename&class
事实上,typename和class没有什么本质上的区别,只是我们更常用typename
类模板
类模板语法
template <typename T> class classnames{
//TODO
}
这样之后,就可以在类的成员函数、成员变量之中使用类型参数T了
类模板示例
定义一个点类,其中点的二维坐标可以用整数、小数、字符串来表示
template <typename T1, typename T2> class Point{
private:
T1 m_x;
T2 m_y;
public:
Point(T1 x,T2 y):m_x(x),m_y(y){};
~Point();
T1 get_x() const;
T2 get_y() const;
void set_x(T1 x);
void set_y(T2 y);
}
对成员函数的定义(definition)不要忘了加上模板头。此处略去。
使用类模板创建对象:
//main函数内部
Point<int, int> p1(10,20);//和函数模板不同,必须显式地指明数据类型
Point<float, char*> p2(12.4,"东经180°");
//可以使用对象指针的方式进行实例化
Point<float,float> *p = new Point<float,float>(10.6,200.9);
//注意,赋值号两边都要知名具体的数据类型且必须一样