c++模板概述
来源:互联网 发布:css模块化编程 编辑:程序博客网 时间:2024/06/10 21:54
编程类型:
一、面向过程:接近事实,代码量大,维护难,强聚合
二、面向对象:(多态)接口简单,代码结构清晰,但设计难度大
三、模板编程(泛型编程):特点:(减少代码量)生成代码的代码
通过函数模板写的模板函数,在实例化(编译,运行前)时自动推导生成代码。所以模板参数不能是指针、对象(因为二者是运行时确定的)
多态
动态多态静态多态(泛型)代码生成期间运行期间编译期间特点面向对象(例:纯虚数)有统一接口,运行速度快,非强制执行。但更难调试。
模板编程
注意:
1、不能像编写普通类一样分成两个文件,.cpp文件包含.h(头)文件。这样会出错,因为定义的时候.h文件换为相应的数据类型(例<int>),但是.cpp文件还是(例<T>)。所以不用分开,全部写在头文件(写在头文件里的函数默认是inline函数)
特殊方法:尾分离(.cpp可改为.pcc)
2、模板参数可以传入推导类型的值,但必须是常量
3、在模板类里面,不能直接使用成员变量,需做接口(例:GetValue();SetValue();)
类模板
模板类
成员模板:类(可以是非模板类)里面的模板
若既有类模板又有成员模板,并且声明实现分开写时,类模板必须写在前面
模板函数
模板函数不是单纯地函数,它是用来生成函数的模板(不会凭空的生成)
模板参数列表里的参数必须在函数参数列表或中使用一次
若指定返回值(如下)则函数可以运行(但没意义,不推荐)
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){};
模板类:
全特化:相当于一个全新的类,模板类不会生成
写法:类名<特化类型>
偏特化:特化具体方法,其余的会自动生成
写法:类名<特化类型>::函数名(参数)
//原型:同上
- 模板概述
- C++:标准库和标准模板库STL概述
- 模板化控件概述
- 用例概述模板
- C++模板概述
- KendoUI模板引擎 - 概述
- 标准模板库概述
- kendoUI模板概述(template)
- c++模板概述
- 模板阴影理论概述
- c++模板概述
- C C语言概述
- 数据模板化概述---MSDN
- DedeCms模板安装/制作概述
- boost 模板元编程概述
- C++-模板
- C++-模板
- C++:模板
- Android 简单 控件
- MFC开发笔记
- spring结合redis如何实现数据的缓存
- YDT-Routesim 学习(一)
- linux之GPIO的使用------OK6410
- c++模板概述
- 取二维数组某一列的值
- Laravel应用目录结构
- PHP面试题及答案(原创)收藏
- spring framework源码下载并导入eclipse
- shell+C
- markdown语法
- 使用刚体进行移动的一种方式
- Android 数据存储 利用SQLiteDatabase实现简单的学生管理