C C经典教程(八).docVIP

  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文档。上传文档
查看更多
C C经典教程(八)

C C经典教程(八) 本文由2012shijiebei贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 伍亿人才招聘网—人才基地,企业动力,群英汇聚在伍亿! C++/C 经典教程(八) 经典教程( 第八章 C++函数的高级特性 函数的高级特性 对比于 C 语言的函数,C++增加了重载(overloaded)、内联(inline)、const 和 virtual 四种新机 制。其中重载和内联机制既可用于全局函数也可用于类的成员函数,const 与 virtual 机制仅用于类的成员 函数。 重载和内联肯定有其好处才会被 C++语言采纳, 但是不可以当成免费的午餐而滥用。 本章将探究重载 和内联的优点与局限性,说明什么情况下应该采用、不该采用以及要警惕错用。 8.1 函数重载的概念 8.1.1 重载的起源 自然语言中,一个词可以有许多不同的含义,即该词被重载了。人们可以通过上下文来判断该词到底是 哪种含义。“词的重载”可以使语言更加简练。例如“吃饭”的含义十分广泛,人们没有必要每次非得说清楚具 体吃什么不可。别迂腐得象孔已己,说茴香豆的茴字有四种写法。 在 C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,即函数重载。这样便于记忆,提 高了函数的易用性,这是 C++语言采用重载机制的一个理由。例如示例 8-1-1 中的函数 EatBeef,EatFish,EatChicken 可以用同一个函数名 Eat 表示,用不同类型的参数加以区别。 void EatBeef(…); void EatFish(…); void EatChicken(…); // 可以改为 // 可以改为 // 可以改为 void Eat(Beef …); void Eat(Fish …); void Eat(Chicken …); 示例 8-1-1 重载函数 Eat C++语言采用重载机制的另一个理由是: 类的构造函数需要重载机制。 因为 C++规定构造函数与类同名 (请参见第 9 章),构造函数只能有一个名字。如果想用几种不同的方法创建对象该怎么办?别无选择, 只能用重载机制来实现。所以类可以有多个同名的构造函数。 伍亿人才招聘网—人才基地,企业动力,群英汇聚在伍亿! 8.1.2 重载是如何实现的? 几个同名的重载函数仍然是不同的函数,它们是如何区分的呢?我们自然想到函数接口的两个要素:参 数与返回值。 如果同名函数的参数不同(包括类型、顺序不同),那么容易区别出它们是不同的函数。 如果同名函数仅仅是返回值类型不同,有时可以区分,有时却不能。例如: void Function(void); int Function (void); 上述两个函数,第一个没有返回值,第二个的返回值是 int 类型。如果这样调用函数: int x = Function (); 则可以判断出 Function 是第二个函数。问题是在 C++/C 程序中,我们可以忽略函数的返回值。 在这种情况下,编译器和程序员都不知道哪个 Function 函数被调用。 所以只能靠参数而不能靠返回值类型的不同来区分重载函数。 编译器根据参数为每个重载函数产生不同 的内部标识符。例如编译器为示例 8-1-1 中的三个 Eat 函数产生象_eat_beef、_eat_fish、_eat_chicken 之类的内部标识符(不同的编译器可能产生不同风格的内部标识符)。 如果 C++程序要调用已经被编译后的 C 函数,该怎么办? 假设某个 C 函数的声明如下: void foo(int x, int y); 该函数被 C 编译器编译后在库中的名字为_foo, C++编译器则会产生像_foo_int_int 之类的名字用来支 而 持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用 C 函数。C++提供了一个 C 连接交换指定符号 extern“C”来解决这个问题。例如: extern “C” { void foo(int x, int y); … // 其它函数 } 或者写成 extern “C” 伍亿人才招聘网—人才基地,企业动力,群英汇聚在伍亿! { #include “myheader.h” … // 其它 C 头文件 } 这就告诉 C++编译译器,函数 foo 是个 C 连接,应该到库中找名字_foo 而不是找_foo_int_int。C++ 编译器开发商已经对 C 标准库的头文件作了 extern“C”处理, 所以

文档评论(0)

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

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

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档