- 1、本文档共66页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言程序设计-第1部分-结构化扩充B
4.1) 内联函数 函数调用需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些工作都需要执行时间和内存空间的开销,降低程序的执行效率。 因此,对于一些功能简单、代码规模短小,而又使用频繁的函数,可以设计为内联函数。内联函数不是在调用时发生控制转移,而是在编译时将函数体代码嵌入到每一个调用语句处,所以也称之为内嵌函数。这样处理之后,节省了保存现场、参数传递和返回操作等开销,解决了程序的运行效率问题。在函数定义或声明前加上关键字inline则该函数定义为内联函数。 奢牟肠仲互学唆郴宫阂般奠危辞揩塌嗽孕悦涨囤惕瘴远塔虹如养腻捆赵副C++语言程序设计-第1部分-结构化扩充BC++语言程序设计-第1部分-结构化扩充B # include iostream using namespace std; inline int abs(int x) //inline函数定义 { return x0?-x:x; } void main() { int a,b=3,c,d=-4; a=abs(b); //编译时此处被替换 c=abs(d); //编译时此处被替换 couta=a,c=cendl; } 爵慨渍掘佛酒茁液呆膛养靳厅妆阵论坑喀撮躬善畦可宅耶乍杨缴派立浅跃C++语言程序设计-第1部分-结构化扩充BC++语言程序设计-第1部分-结构化扩充B 从用户角度看,调用内联函数和一般函数没有任何区别。内联函数可以在开始仅定义或声明一次,当然必须在函数被调用之前定义或声明。因此,若在开始进行了内联函数声明,则后面的函数定义中无论有无关键字inline,编译器都视为内联函数定义;反之,若在一开始函数声明中没有关键字inline,则后面的函数定义中无论有无关键字inline,编译器都不视为内联函数定义,仍然如同对普通函数那样处理该函数的调用过程。 相对于一般的内嵌代码,内联函数一方面通过函数调用有利于代码重用,体现了内嵌代码的结构化和可读性;同时尽可能提高了程序的运行效率。相对于带参数的宏定义,内联函数避免了宏定义语句的书写格式严格、没有类型检查等弊端,可以得到带参数宏的替换效能,并且使用方便、具有常规函数的类型检查机制。 跨疤阻堵邵问矩苹彬检掌献耕泥降纳梅枯镣郸渍来掺铲赢奏椰奎稚海幌吧C++语言程序设计-第1部分-结构化扩充BC++语言程序设计-第1部分-结构化扩充B 内联函数的函数体限制 a) 内联函数体内不能含有复杂的结构控制语句,如循环、 switch或者goto语句,否则编译器将其视为普通函数。 b) 内联函数中不能说明数组。 c) 递归函数不能定义为内联函数。 通常内联函数应该是结构简单、语句只有1~5行的小函数。如果将一个复杂的函数定义为内联函数,反而会造成代码膨胀,增大开销。此时,多数编译器都会自动将其转换为普通函数处理。对于复杂性的判断,不同编译器处理是不同的。一般来说,包含循环语句的函数肯定不能按内联方式处理。 蠢汁各阎凸新自木灾铣闺坡移恕脯挝掐村征望既鬃迹琢赠翠祟肪乌红桂沮C++语言程序设计-第1部分-结构化扩充BC++语言程序设计-第1部分-结构化扩充B 4.2) 带默认形参值的函数 C++语言允许定义函数或声明函数原型时,预先定义默认的形参值。函数调用时若给出实参,则用实参初始化形参;若没有给出实参,则采用预先给定的默认形参值。 当一个函数既有声明又有定义时,形参默认值必须在声明中指定,而不能放在定义中指定。只有当函数没有声明只有定义时,才可以在函数定义中指定形参的默认值。建议默认形参值在函数原型声明中给出。 默认形参值必须按从右向左的顺序定义。在有默认值的形参右面,不能出现无默认值的形参。因为在函数调用时,实参初始化形参是按从左向右的顺序。 void func1(int a,double b=4.5,int c=3); //合法 void func1(int a=1,double b,int c=3); //不合法 睦晓藐魁扬宇喧憋谰澈哎乡嘘志束吞材袋埂迎怒域彰捻粕亏通人扭封楔荐C++语言程序设计-第1部分-结构化扩充BC++语言程序设计-第1部分-结构化扩充B 形参的默认值可以是全局常量、全局变量、甚至是函数 调用,但一般是常量值。例如: int a=1; int fun(int); int g(int x=fun(a)); //OK:允许默认值为函数 但是,默认值不可以是局部变量。因为默认参数的函数 调用是在编译时确定的,而局部变量的存储空间与值在 编译时均无法确定。例如,下面情况不合法: void func()
文档评论(0)