推动政务网站建设,搜索引擎优化论文,软文推送,免费的企业建站cms目录
一.泛型编程
二.模板
函数模板
类模板 一.泛型编程
在C中#xff0c;支持函数重载#xff0c;如果我们通过函数重载实现通用的交换函数#xff0c;写法如下#xff1a;
void Swap(int left, int right)
{int temp left;left right;ri…目录
一.泛型编程
二.模板
函数模板
类模板 一.泛型编程
在C中支持函数重载如果我们通过函数重载实现通用的交换函数写法如下
void Swap(int left, int right)
{int temp left;left right;right temp;
}
void Swap(double left, double right)
{double temp left;left right;right temp;
}
void Swap(char left, char right)
{char temp left;left right;right temp;
}
......非常冗余于是我们引入泛型编程的概念通过编写与类型无关的代码实现代码的复用。而在C中模板就是泛型编程的基础。 二.模板
模板有两种函数模板和类模板 函数模板
语法 templatetypename T1, typename T2, ..., typename T3 返回值类型 函数名参数列表{} typename是用来定义函数模板的关键字也可以使用class关键字。
样例
//交换函数模板
templatetypename T
void Swap(const T x, const T y)
{T tmp x;x y;y tmp;
}int main()
{int i1 1, i2 2;double d1 1.1, d2 2.2;char c1 a, c2 b;//隐式实例化Swap(i1, i2);//隐式推导生成void Swap(const int x, const int y);Swap(d1, d2);//隐式推导生成void Swap(const double x, const double y);Swap(c1, c2);//隐式推导生成void Swap(const char x, const char y);//显式实例化float f1 1.1, f2 2.2;Swapfloat(f1, f2);//显式(手动)生成void Swap(const float x, const float y);return 0;
} 模板函数是一个蓝图非具体函数而是编译过程中编译器根据蓝图生成了具体类型的函数。 模板参数实例化的两种方式 隐式实例化编译器根据实参推演模板参数的实际类型 显式实例化函数名,在中指定模板参数的实际类型 如果一个非模板函数和同名函数模板同时存在且调用时实参和非模板函数完全匹配编译器会优先调用这个非模板函数。 类模板
语法 templatetypename T1, typename T2, ... , typename Tn class 类模板名 { //成员定义 }; 实现一个栈的类模板:
//Stack
templatetypename T
class Stack
{
public://构造函数Stack(int n 4):_arr(new T[n]),_top(0),_capacity(n){}//析构函数~Stack(){delete[] _arr;_arr nullptr;_top _capacity 0;}void Push(const T x){T* tmp new T[_capacity * 2];memcpy(tmp, _arr, sizeof(T) * _top);delete[] _arr;_arr tmp;_capacity * 2;_arr[_top] x;}void Pop(){_top--;}//...
private:T* _arr;int _top;int _capacity;
};int main()
{//Stackint和Stackdouble是类型Stack仅仅是类名Stackint st_i;//存储int类型数据的栈Stackdouble st_d;//存储double类型数据的栈return 0;
} 上述代码中,Stackint和Stackdouble是显式实例化出的两个存储不同数据类型的栈它们属于不同的类型。
类模板实例化需要在类模板名字后跟然后将实例化的类型放在中即可类模板名字不是真正的类而实例化的结果才是真正的类。 今天的内容就到这感谢大家的支持!