基于过程的程序设计.ppt
文本预览下载声明
基于过程的程序设计 内容纲要 一、基于过程的程序设计概述 二、函数 三、域和生命期 四、函数模板 五、使用泛型 四、函数模板 C++的函数重载 使用相同的函数名定义多个功能相似、而参数不同的函数 例如: int sum(int a,int b) double sum(double a,double b) float sum(float a,float b) complex sum(complex a,complex b) 四、函数模板 观察:四个函数具有统一模式 四、函数模板 参数宏 例如: #define max(a,b) ((a)(b)?(a):(b) ) 问题:简单地字符串替换,丢掉了C++的强类型检查功能 函数模板(function template) 对函数的类型和返回值进行参数化而形成的通用函数版本 四、函数模板 template typename Type Type max(Type a, Type b) { return ab?a:b; } int main() { max(10, 20); //max(int, int) max(10.0, 20.0); //max(double, double) max(10, 20.0); //max(int, double)不存在 } 四、函数模板—定义 函数模板定义的语法 template模板参数表 返回类型 函数名(形式参数表) { …… }//函数体 模板参数表由一组逗号隔开的模板参数组成 模板参数有两种:模板类型参数和模板非类型参数 四、函数模板—定义 模板参数有两种: 模板类型参数 class 类型名 或者:typename 类型名 模板非类型参数:普通的参数声明,表示该参数名代表了一个将要使用的值。 四、函数模板—实例化 四、函数模板—实例化 问题:在函数模板的实例化过程中,如何根据函数实参的类型来决定模板实参的类型和值? 四、函数模板—实例化 方式一:隐式推演 四、函数模板—实例化 四、函数模板举例-swap 功能:交换两个对象 变量交换:swap(Any, Any) 数组交换:swap(Any*, Any*, int n) 函数模板小结 函数模板的概念 函数模板的定义 函数模板的实例化 模板实参推演与显式指定 五、使用泛型 通过函数模板可以编写类型通用函数 五、使用泛型 五、使用泛型 实现理想状态,需要: 通用的容器 通用算法 某种遍历集合的方式 实现容器元素与被匹配元素进行比较的算子 五、使用泛型 C++的标准模板库STL 泛型编程的一种实现 1994年纳入C++标准 C++ STL实现理想状态的设施 泛型容器(container) 泛型算法(algorithms) 迭代器(iterator) 函数对象(function object) 五、使用泛型 五、使用泛型—举例 【举例1】计数以’S’开头的字符串个数 templateclass InIt, class Pred, class Dist size_t count_if(InIt first, InIt last, Pred pr); 计算[first, last)范围内使谓词返回true的元素个数,并返回计数结果 五、使用泛型—举例 【举例2】应用累计函数accumulate templateclass InIt, class T T accumulate(InIt first, InIt last, T val); 在[first, last)范围内对迭代器InIt的每个值,以val + *InIt替代val,最后返回val。 templateclass InIt, class T, class Pred T accumulate(InIt first, InIt last, T val, Pred pr); 在[first, last)范围内对迭代器InIt的每个值,以Pred(val, *InIt)替代val,最后返回val。 五、使用泛型—举例 【举例3】替换序列中特定的值 templateclass FwdIt, class Pred, class T void replace_if(FwdIt first, FwdIt last, Pred pr, const T val); 对[0, last - first)范围内的每个N,如果谓词pr(*(first + N))返回true,则应用一次*(first + N) = val 附加材料 详细解析容器、算法、迭代器、函数对象 五、使用泛型—容器 容器:可包含并管理其它的对象,并提供迭代器(iterator)用以定址其所包含之元素
显示全部