第5章 函数与函数模板.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第5章 函数与函数模板

5.4.2 返回引用的函数 使用const的限定 如果不希望函数返回的引用对象被修改,也可以使用const关键字对返回值进行限制,如: const int conv(int a); 这将导致conv(x)是一个常量。 应该说,如果需要传递一个复杂的对象,采用引用做函数参数或返回值是非常理想的方案。 * 5.5 递归函数 自己复习。 * 5.6 内联函数 在发生一次函数调用时,意味着环境保护、参数交换、执行被调用函数代码和恢复调用前环境等一系列操作,这些额外开销使得函数调用比直接执行函数体代码的效率要低一些。 将函数定义为内联函数的方法是将inline加在定义和声明之前,如: inline int max(int a, int b) { return a b ? a : b ; } * 5.6 内联函数 如果一个函数被指定为内联函数,它将在程序中每个调用点上被内联地展开。例如: int maxV = max(3+2,7)+max(i, j); 在编译时被展开为: int maxV = (5 7 ? 5 : 7)+(i j ? i : j); * 5.6 内联函数 在定义内联函数时应注意两方面的问题: inline只是对编译器的建议而非命令。因此,内联函数应是结构简单、语句短小的函数,不能在内联函数中使用流程控制语句,也不能含有递归调用。 内联函数必须在调用该函数的每个文本文件中定义,第一次调用前必须有冠以inline的声明或定义。因此,在有定义和声明时,保险的做法是都加上inline关键字。 * 5.7 函数重载 由于函数重载使一个名字具有“多种功能”,被认为是具有“多种形态”性质。这是面向对象程序设计技术中的一个十分重要的特征——多态性。 函数重载允许多个函数共享同一个函数名,其主要目的是针对不同参数类型提供相同的操作。 * 5.7 函数重载 1 函数重载的实现 利用函数重载技术,我们可以用相同的函数名定义出不同的函数: int max(int v1, int v2) { return v1v2?v1:v2; } int max(int v1, int v2, int v3) { int v12 = v1v2?v1:v2; return v12v3?v12:v3;} double max(double v1, double v2) { return v1v2?v1:v2; } const char* max(const char* s1, const char* s2) { return strcmp(s1, s2)0?s1:s2; } * 5.7 函数重载 2 重载函数中的问题 在语法上,函数的形式不同是指重载的函数必须具有不同的形式参数表,即不同的参数类型、数量或顺序。 返回类型不同不能作为区分函数的依据,即不能重载参数表相同而只有返回值不同的函数。 void func(int x, int y); int func(int a, int b); //错误的重载 * 5.7 函数重载 重载函数最主要的目的是为了应付不同的数据类型,各重载函数应该执行一致的操作。 如果仅是参数个数不同,可以借助参数的缺省值来处理而不是进行函数重载。 例如,对于如下的重载函数: int setData(int); int setData(int, int); 可以考虑用如下的一个函数代替: int setData(int, int=0); * 5.8 指向函数的指针 1 函数指针 任何一个函数在编译后都对应一系列的指令,这些指令在内存中占据一块连续的存储单元,粗略地说,其中第一条指令的地址被称为函数的“入口地址”,函数的一次调用就是通过将函数的入口地址写入程序计数器完成的。 函数的入口地址被称为指向函数的指针。 在C++中,一个函数的名字代表了函数的入口地址,即函数名是指向该函数的指针。例如,若有如下函数定义:void func(int x){ … } 则函数名func是指向此函数代码的指针,系统的每次函数调用都使用了这一指针。 * 5.8 指向函数的指针 2 指向函数的指针变量 指向函数的指针变量。一般定义形式如下: type (*变量名)(形参说明表); 例如,为了存储函数指针func,应按如下形式定义变量: void (*fpx)(int x); fpx = func; 如果需要明确描述出某种类型的函数指针,可以先用typedef进行定义: typedef void (*fpx)(int); fpx p1, p2, pa[5]; * 5.8 指向函数的指针 3 函数指针的赋值 由于函数指针的特殊性,所以允许参与的运算主要是赋值和调用函数。 double (*fpx)(dou

文档评论(0)

allap + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档