欢迎
游客
,
注册
|
登录
|
会员
|
界面
|
简洁版本
|
在线
|
帮助
商都网教育宝典宝库
商都网教育宝典宝库
计算机
等级考试
深入剖析C++重载函数的应用
本主题被查看193次, 共1个帖子, 1页, 当前为第
1
页 选择页数: 1 跳转到第
页
上一主题
下一主题
标题: 深入剖析C++重载函数的应用
huahua
-[尕硴]
超级版主
UID: 71
来自:
精华:
130
积分: 14003
帖子: 12909
注册: 2007-10-22 17:59:00
状态:
离线
威望: 444.00
金钱: 3355.00 元
发短消息
用户资料
树型
回复
引用
只看楼主
2008-04-11 09:48
深入剖析C++重载函数的应用
重载函数(overloaded function)是C++支持的一种特殊函数,C++编译器对函数重载的判断更是C++语言中最复杂的内容之一
首先我们先明确一下重载函数的定义:在相同的声明域中的函数名相同的,而参数表不同的,即通过函数的参数表而唯一标识并且来区分函数的一种特殊的函数。
您也许要问,函数为什么要重载呢?何时应该选择函数重载(function overloading),何时又不呢?这也是我要在下面介绍的。
当将要定义一组函数,使它们执行一系列的操作,但是它们是应用在不同的参数类型上的。此时我们可以选择重载函数。
例如: int z_x_max (int,int); //返回两个整数的最大值;
int ve_max (const vector <int> &); //返回vector容器中的最大值;
int matrix_max (const matrix &); //返回matrix引用的最大值;
上面的三个函数都可以大概地说成判断一组数中的最大值,对于函数的用户来说,他们并不关心函数定义的细节,也就是说他们不关心判断两个整数的大小和判断数组(vector容器)数的大小应该使用不同的函数,而对于程序的设计者来说这可是不得不想到的。程序员必须记住并查找每个函数名。而函数的重载把程序员从这种问题的复杂性中解放了出来,C++提供了这种支持。上面的三个比较大小的函数可以定义成:
int Max (int,int); //返回两个整数的最大值;
int Max (const vector <int> &); //返回vector容器中的最大值;
int Max (const matrix &); //返回matrix引用的最大值;
对!通过参数就可以一眼分辨不同的函数。
同时函数的重载也有它不适用的情况。例如:在开发文本编辑器的过程中,会涉及到一系列控制光标的函数,如下:
Screen& MoveUp( );
Screen& MoveDown( );
Screen& MoveLeft( );
Screen& MoveRight( );
看过这四个函数不言而喻,它们是控制光标在屏幕上的位置的,即:向上移动光标,向下移动光标,向左移动光标,向右移动光标。如果我现在把它们写成重载函数,每个都是Screen& Move( );显然对于程序员来说是不易理解的。因此对于函数重载的使用我们应遵循应用的逻辑,而不是简单地因为它的存在就必须使用它。程序员不应该勉强使用重载函数。
您有没有想过C++编译器是如何判断您调用的是重载中的哪个函数?即使它们的函数名相同。您也许会毫不犹豫的回答:是通过函数的参数表。其实识别的过程并不是像您想象中的那么的容易,其中涉及到参数的等级划分,参数转换等诸多方面,下面我就一一进行讲解。
假如有下面一组函数:
void S ( );
void S ( int );
void S ( double , double = 1.2 );
void S ( const char*,const char*);
void Max ( int , int );
//……
int main( )
{
S (2.4);
return;
}
//S (2.4 );的调用与S ( ); S ( int ); S ( double , double = 1.2); S (const char* , const char*),的声明在同一域,即是可见的。
那么好,问题出现了。S (2.4 );将调用上面四个函数中的哪一个呢?
编译器判断重载函数的第一步是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与被调用函数同名的函数。上面的前四个函数都可以成为候选函数(当然可以是多个),而唯有Max ( int , int ) 被排除在外了。
编译器判断重载函数的第二步分为两动作。第一个动作是编译器从第一步选出的候选函数中调出可行函数(viable function)。可行函数的函数参数个数与调用的函数参数个数相同(如S ( int )),或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的缺省值(如 S (double , double =1.2 );)第二个动作是根据参数类型的转换规则将被调用的函数实参转换(conversion)成候选函数的实参。这里本着充分利用参数类型转换的原则,换句话说,尽可能的使用上参数类型转换。当然转换要以候选函数为转换的目标。上面的函数中只有两个是可行函数,它们分别是S ( int ); S ( double , double )。
#1
大
中
小
本主题被查看193次, 共1个帖子, 1页, 当前为第
1
页 选择页数: 1 跳转到第
页
论坛跳转...
胎教早教
准备怀孕
怀孕期
出生与分娩
婴儿期(0-1岁)
幼儿期(1-3岁)
学龄前(3-6岁)
中小学
课件
试题
中招
中招动态
招生快讯
相关政策
考试辅导
语文
数学
英语
物理
化学
生物
政治
历史
地理
家长交流
历年中招资料
满分作文
高考
高考动态
高考状元
历年试题
家长必读
志愿填报
心理减压
复习技巧
考生经验
备考辅导
高考大纲
历年分数线
高考常识
高考指南
语文
数学
外语
物理
化学
生物
历史
地理
政治
文综
理综
高考满分作文
家长
教师
读书
作文
郑州新东中学
学校动态
学生天地
高等教育
移民留学
成人高考
自学考试
考研
论文
外语
雅思
托福
四六级
实用英语
职称外语
公共英语(PETS)
商务英语
英语口语
小语种
英思力美语
在线留言
学校动态
课程
学生作业
英思力相册
学英语资料
计算机
办公应用
软件开发
平面动画设计
IT资格认证
等级考试
网络工程
初学者之路视频教程
计算机基础
Windows
Word2003
Execl2003
Powerpoint
Flash
Deamweaver
Fireworks
黑客基础
北大青鸟
青鸟新闻
开班信息
青鸟师资
在线问答
学员相关
技术文章
职业资格
企业培训师
资料库
历年试题
案例探讨
相关政策
财务会计
公务员考试
营养师
营养动态
职业前景
健康权威
学习指导
营养知识
健康食谱
心理咨询师
心理俱乐部
学习指导
花季少年
爱情婚姻
心理障碍
人在职场
职业前景
经典案例
导游
司法考试
建筑工程资格
外贸资格
医药资格考试
教师资格考试
电子商务师
人力资源师
资料库
历年试题
案例探讨
相关政策
技能培养
汽车驾驶
美容美发
美容
美发
化妆
整体形象设计
相关课程
人才信息
茶艺
调酒
厨师烹饪
手机维修
音乐乐器
舞蹈健身
企业管理
人力资源
市场营销
管理激励
管理书籍
管理视频
信诺专栏
职场招聘
招聘信息
职场沙龙
现在的时间是 2008-07-07 09:43:24
版权所有
商都网教育宝典
Powered by
Discuz!NT
1.0.6666 Copyright © 2001-2008
Comsenz Inc
.
Processed in 0.144 seconds