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