C++模板

    xiaoxiao2021-03-25  93

    (1)基本概念 定义:实际上就是建立一个通用函数,其函数类型和函数形参不具体指定,用一个虚拟的类型来代替 作用:使同一段程序代码可以处理多种不同类型的对象从而实现代码共享 适用类型:函数体相同,函数的参数个数相同而类型不同的情况 (2)一般形式 template <typename T>       //typename也可以用class代替,二者无异 通用函数定义 一般模板必须写在.h文件中,模板的声明和定义要放在一起 (3)函数模板 1.函数模板不是函数,不能被执行 在编译阶段会实例化函数模板得到模板函数,模板实际上被编译两次,一次时检查函数模板的是否存在语法错误,第二次是检查实例化后的模板函数是否存在语法错误 真正被执行的是模板函数 2.函数模板可以被重载,但是需要注意的是重载函数模板时也要加上 template <typename T> 3.当有函数模板和自己实现的函数时,优先调用自己实现的函数 4.函数模板的具体化:函数模板对于某些特殊情况并不适用,可4以针对特殊情况将函数模板特例化 示例: //*********1.函数模板****************************** template <typename T> const T& max(const T& a, const T& b) {     return a > b ? a : b; } //**********2.函数模板的重载************************** template <typename T> const T& max(const T& a, const T& b,const T& c) {     return (a > b ? a : b) > c ? (a > b ? a : b) : c; } //***********3.自己实现的函数************************** const int max(const int& a,const int& b) {     cout << "my template" << endl;     return a > b ? a : b; } //************4.函数模板的特例化************************* template <> const char * const& max(const char * const& a,const char * const& b) {     return (strcmp(a,b)) > 0 ? a : b; } (4)类模板:将类定义中的数据类型参数化 1. 示例: #ifndef _STACK_H_ #define _STACK_H_ template <typename T> class Stack { public: Stack(int maxSize); ~Stack(); void Push(const T& t); void Pop(); T& Top() const; bool Empty() const; private:         T *s_; int top_; int maxSize_; }; //注意在类外实现时每一个成员函数前都要加 template <typename T> Stack<T>::Stack(int maxSize) : maxSize_(maxSize), top_(-1) { s_ = new T[maxSize]; } template <typename T> Stack<T>::~Stack() { delete [] s_; } //入栈 template <typename T> void Stack<T>::Push(const T& t) { if(top_ == maxSize_ - 1) { throw(1); } s_[++top_] = t; } //出栈 template <typename T> void Stack<T>::Pop() { if(top_ + 1 == 0) { throw(2); } top_--; } //取栈顶 template <typename T> T& Stack<T>::Top() const { if(top_ + 1 == 0) { throw(2); } return s_[top_]; } //判断是否为空栈 template <typename T> bool Stack<T>::Empty() const { return top_ + 1 == 0; } #endif 。。。 int main() {       Stack<int> s1(100);       s1.Push(5);   cout << s.Top() << endl;       return 0; } //运行结果为   5;
    转载请注明原文地址: https://ju.6miu.com/read-23190.html

    最新回复(0)