c++模板概述

来源:互联网 发布:css模块化编程 编辑:程序博客网 时间:2024/06/10 21:54

编程类型:

一、面向过程:接近事实,代码量大,维护难,强聚合

二、面向对象:(多态)接口简单,代码结构清晰,但设计难度大

三、模板编程(泛型编程):特点:(减少代码量)生成代码的代码

 通过函数模板写的模板函数,在实例化(编译,运行前)时自动推导生成代码所以模板参数不能是指针、对象(因为二者是运行时确定的)


多态

 动态多态静态多态(泛型)代码生成期间运行期间编译期间特点面向对象(例:纯虚数)有统一接口,运行速度快,非强制执行。但更难调试。


模板编程

注意:

  1、不能像编写普通类一样分成两个文件,.cpp文件包含.h(头)文件。这样会出错,因为定义的时候.h文件换为相应的数据类型(例<int>),但是.cpp文件还是(例<T>)。所以不用分开,全部写在头文件(写在头文件里的函数默认是inline函数)

     特殊方法:尾分离(.cpp可改为.pcc

[cpp] view plain copy
  1. template<typename T>  
  2. const T Max(T lhs,T rhs);  
  3.   
  4. #include"Demo.cpp"  

    2、模板参数可以传入推导类型的值,但必须是常量

  3、在模板类里面,不能直接使用成员变量,需做接口(例:GetValue();SetValue();)



类模板

[html] view plain copy
  1. template<class _Ty>  

模板类

[cpp] view plain copy
  1. template<class _Ty>  
  2. class Demo(){};  


成员模板:类(可以是非模板类)里面的模板

     若既有类模板又有成员模板,并且声明实现分开写时,类模板必须写在前面


模板函数

模板函数不是单纯地函数,它是用来生成函数的模板(不会凭空的生成)

模板参数列表里的参数必须在函数参数列表或中使用一次

           若指定返回值(如下)则函数可以运行(但没意义,不推荐)

template<typename T>const T Max(int lhs,int rhs){       return lhs>rhs?lhs:rhs;}int main(){       Max<double>(1,2);       return 0;}

模板类 

例:

template<typename T>class Demo{...};

  模板类的继承

        非模板类可继承模板类(需写出特化类型)

       例:(继承上类)class Other:public Demo<char>{};


模板函数的重载(不支持提升转换)

    条件:模板参数或函数参数不同;或同名的普通函数

//例://原型template<typename T>bool Max(T lhs,T rhs){       return lhs>rhs?lhs:rhs;}//重载一template<typename T1,typename T2>const T1 Max(T2 lhs,T2 rhs){       return lhs>rhs?lhs:rhs;}//重载二template<typename T>const T Max(T lhs,T rhs){       return lhs>rhs?lhs:rhs;}


模板的特化(属于函数模板,不是重载,可以提升转换

    模板函数:

         例:原型:同上      特化:template<>const char*Max(const char*lhs,const char*rhs){};

    模板类:

        全特化:相当于一个全新的类,模板类不会生成

      写法:类名<特化类型>

[cpp] view plain copy
  1.    //原型  
  2. template<typename T>  
  3. class Demo  
  4. {  
  5.    Demo();  
  6.    ~Demo():  
  7.        ...  
  8. };  
  9. //全特化  
  10. template<>  
  11.    class Demo<int>  
  12.    {...};  

   偏特化:特化具体方法,其余的会自动生成

                写法:类名<特化类型>::函数名(参数)

     //原型:同上    

[cpp] view plain copy
  1. template<>  
  2. Demo<int>::Demo()  
  3. {...}  
0 0