c程序设第三章函数和函数模板.ppt
文本预览下载声明
第三章 函数和函数模板 3.1函数的参数及其传递方式 二、对象指针作为函数参数 三、引用做函数参数 四、默认参数 五、用const保护数据 作业 课程回顾 3.2 深入讨论函数返回值 一、返回引用的函数 二、返回指针的函数 三、返回对象的函数 四、函数返回值做函数参数 3.3内联函数 3.5函数重载和默认参数 3.5函数模板 一、函数模板 1、声明函数模板 2、编写函数模板 课程回顾 3、使用函数模板 5、重载函数模板 函数调用的匹配顺序 作业: 注意: 函数重载和默认参数可同时使用。 若已定义默认参数函数,则不能重载参数类型相同,参数个数少于默认参数个数的函数。 有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用函数模板实现。 int max(int a,int b) {if(ab) return a; else return b; } double max(double a,double b) {if(ab) return a; else return b; } char max(char a,char b) {if(ab) return a; else return b; } 编制这些函数所提供的程序文本完全相同! 比较这三个函数的异同! 处理的数据类型不同! T max(T a, T b) {if(ab) return a; else return b; } int max(int a,int b) {if(ab) return a; else return b; } double max(double a,double b) {if(ab) return a; else return b; } char max(char a, char b) {if(ab) return a; else return b; } 如果把其中的类型名称抽象出来用一个符号(比如T)来表示,则有如下的抽象形式: 函数模板 T T T T T T T T T 很多情况下,设计的函数可以处理多种数据类型,但是即使设计为函数重载也只是使用相同的函数名,函数仍然要分别定义。 函数模板之所以能以同样的程序代码对不同类型的数据进行处理,其关键是将所处理的数据类型声明为参数,即类型参数化。函数重载通常基于不同的数据类型实现类似的操作,而对不同数据类型的操作完全相同,用函数模板更为简洁方便。 函数模板是对一组函数的描述,它不是一个真实的函数,编译系统并不产生任何执行代码。当编译系统在程序中发现有与函数模板中相匹配的函数调用时,便生成一个重载函数,该重载函数的函数体与函数模板的函数体相同,该重载函数就是模板函数。 一般格式: template 类型形参表 返回类型 函数名(形参表) { 函数体 } 例如: T max(T a, T b) {if(ab) return a; else return b; } 注:“类型形参表”可以包含基本数据类型,也可以包含类类型。类型形参需要加前缀class或者typename。如果类型形参多于一个,则每个类型形参都需要使用class或者typename。 template class T 模版以template关键字和一个形参表开头。 编写函数模板的一般方式如下: (1)定义一个普通的函数,数据类型采用具体的普通的数据类型。如求两个整数中的较大者: int max(int a,int b) {if(ab) return a; else return b; } (2)将数据类型参数化,将其中具体的数据类型名(如int)全部替换成由自己定义的抽象的类型参数名(如T), T max(T a,T b) {if(ab) return a; else return b; } (3)在函数头钱用关键字template引出对类型参数名的声明。这样就把一个具体的函数改造成了一个通用的函数模板。 T max(T a,T b) {if(ab) return a; else return b; } template class T 模板(template)把函数或类要处理的数据类型参数化,表现为参数的多态性。模板用于表达逻辑结构相同,且具体数据元素类型不同的数据对象的通用行为,从而使得程序可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递。 C++提供了两种模板机制:函数模板和类模板(第七章)。 在声明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的类型形参,然后生成一个重载函数。该重载函数的定义体与函数模
显示全部