C++函数重载详解
我们在开瓶瓶罐罐的时候,经常会遭遇因各种瓶口规格不同而找不到合适的工具的尴尬。所以有时候就为了开个瓶,家里要备多种规格的开瓶器。同样是开个瓶子嘛,何必这么麻烦?于是有人发明了多功能开瓶器,不管啤酒瓶汽水瓶还是软木塞的红酒瓶都能轻松打开。
然而开瓶器的问题也会发生到程序设计中。比如我们要编写一个函数来求一个数的绝对值,然而整数、浮点型数、双精度型数都有绝对值,但为它们编写的函数返回值类型却是各不相同的。比如:
int iabs(int a);
float fabs(float a);
double dabs(double a);
这样是不是有点备了多种开瓶器的感觉?我们能不能在程序设计中也做一个多功能的开瓶器,把所有数据类型的求绝对值都交给abs这一个函数呢?
在C++中,我们也能够把具有相同功能的函数整合到一个函数上,而不必去写好多个函数名不同的函数,这叫做函数的重(音chóng)载(Overload)。重载的本质是多个函数共用同一个函数名。
我们先来看一个函数重载的实例:(程序6.3)
#include "iostream.h"
int abs(int a);//当参数为整型数据时的函数原型
float abs(float a);//当参数为浮点型数据时的函数原型
double abs(double a);//当参数为双精度型数据时的函数原型
int main()
{
int a=-5,b=3;
float c=-2.4f,d=8.4f;
double e=-3e-9,f=3e6;
cout <<"a=" <<abs(a) <<endl <<"b=" <<abs(b) <<endl;//输出函数返回的结果
cout <<"c=" <<abs(c) <<endl <<"d=" <<abs(d) <<endl;
cout <<"e=" <<abs(e) <<endl <<"f=" <<abs(f) <<endl;
return 0;
}
int abs(int a)//函数定义
{
cout <<"int abs" <<endl;//显示运行了哪个函数
return (a>=0?a:-a);//如果a大于等于零则返回a,否则返回-a。
}
float abs(float a)
{
cout <<"float abs" <<endl;
return (a>=0?a:-a);
}
double abs(double a)
{
cout <<"double abs" <<endl;
return (a>=0?a:-a);
}
运行结果:
int abs
int abs
a=5
b=3
float abs
float abs
c=2.4
d=8.4
double abs
double abs
e=3e-009
f=3e+006
运行结果表明,abs函数果然能够处理三种不同数据类型的数据了。那么我们怎样才能自己造一个“多功能工具”呢?
其实要编写一个重载函数并不是很麻烦。首先,我们要告诉电脑,同一个函数名存在了多种定义,所以,我们要给同一个函数名写上多种函数原型(如程序6.3的第二到第四行);其次,我们要对应这些函数原型,分别写上这些函数的定义(如程序6.3的主函数体之后,对三个abs函数的定义)。
然而电脑又是如何来识别这些使用在不同环境下的“工具”的呢?
在日常生活中使用到多功能工具,如果我们不知道具体应该使用哪个工具,我们会把每个工具放上去试一试,如果只有唯一一个工具适合,那么我们就毫无疑问地能够确定就是使用它了。但是如果出现了两个或者两个以上工具都能适合,我们就分不清到底应该使用哪个是正确的了。
电脑的做法和我们是类似的。电脑是依靠函数声明时参数表中参数个数、各参数的数据类型和顺序来判断到底要运行哪个函数的。因此,当重载函数参数表完全相同的时候,电脑便无法判断应该运行哪个函数,于是程序就出错了。
我们了解了电脑是如何识别重载函数以后,发现要编写一个重载函数还是需要注意一些地方的,那就是:在重载函数中,任意两个函数的参数表中的参数个数、各参数的数据类型和顺序不能完全一样。例如int func(int a,char b)和float func(int c,char d)就不能重载,因为它们的参数个数、各参数的类型和顺序完全一样,即使形参名不同、返回值类型不同也是无济于事的。
在调用一个重载函数时,可能会发生找不到一个完全合适的函数。这时候,就需要进行数据类型的转换。由于这种方法可能导致数据丢失或数据类型不严格符合,且在充分考虑问题后,这种情况是可以尽量避免的,所以这里不再就这个问题展开论述。有兴趣的读者可以查阅其他C++的参考资料。
算法时间:重载函数
从某种意义上说,重载函数是方便了函数的使用者。在前一节我们知道,如果完成了所有函数的编写,那么完成一个程序就像搭积木一样简单了。然而如果功能相似名字却不同的函数太多,那么多“积木”搭起来也未必简单。当函数的编写者充分考虑了不同情况下应该运行稍有不同的函数,函数的使用者就不必为这些小细节而烦恼了。不过重载函数的函数名还是应该符合其功能,如果把功能完全不同的函数重载,那么就大大影响了程序的可读性。
原文地址:http://see.xidian.edu.cn/cpp/biancheng/view/35.html
C++函数重载详解的更多相关文章
- 转载 LayoutInflater的inflate函数用法详解
http://www.open-open.com/lib/view/open1328837587484.html LayoutInflater的inflate函数用法详解 LayoutInflater ...
- 自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解
'*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 ...
- SQL Server数据库ROW_NUMBER()函数使用详解
SQL Server数据库ROW_NUMBER()函数使用详解 摘自:http://database.51cto.com/art/201108/283399.htm SQL Server数据库ROW_ ...
- PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
PHP函数篇详解十进制.二进制.八进制和十六进制转换函数说明 作者: 字体:[增加 减小] 类型:转载 中文字符编码研究系列第一期,PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明 ...
- PHP date函数参数详解
PHP date函数参数详解 作者: 字体:[增加 减小] 类型:转载 time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计 ...
- SQL中CONVERT()函数用法详解
SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...
- php中setcookie函数用法详解(转)
php中setcookie函数用法详解: php手册中对setcookie函数讲解的不是很清楚,下面是我做的一些整理,欢迎提出意见. 语法: bool set ...
- eval()函数用法详解
eval()函数用法详解:此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eval()函数的用法.语法结构: eval(str) 此函数可以接受一个字符串str作为参数, ...
- Python学习入门教程,字符串函数扩充详解
因有用户反映,在基础文章对字符串函数的讲解太过少,故写一篇文章详细讲解一下常用字符串函数.本文章是对:程序员带你十天快速入门Python,玩转电脑软件开发(三)中字符串函数的详解与扩充. 如果您想学习 ...
随机推荐
- Python小白的发展之路之Python基础(二)【字符串、列表、集合、文件操作】
列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1.列表.元组操作 (1)列表 列表是可变的(mutable)——可以改变列表的内容,这不同于字符串和元组,字符串和元组都是不 ...
- poj2891(线性同余方程组)
一个exgcd解决一个线性同余问题,多个exgcd解决线性同余方程组. Strange Way to Express Integers Time Limit: 1000MS Memory Limi ...
- term frequency–inverse document frequency
term frequency–inverse document frequency
- 只需两步删除 node_modules
peng@PENG-PC /E/_My_File_____/home/learn/web_qianduan/mithril-demo/demo2/mithril -demo $ npm install ...
- MyBaits面试题
原文地址 Mybatis技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用Mybatis的文章,所以,一些参数使用细节略掉了,我们的 ...
- React Native 列表的总结
React Native 列表的总结 FlatList和SectionList都是React Native中高性能的列表组件.这些新的列表组件在性能方面都有了极大的提升, 其中最主要的一个是无论列表有 ...
- hd acm1048
Problem Description Julius Caesar lived in a time of danger and intrigue. The hardest situation Caes ...
- Centos7 配置yum源 安装epel
一.什么是epel如果既想获得 RHEL 的高质量.高性能.高可靠性,又需要方便易用(关键是免费)的软件包更新功能,那么 Fedora Project 推出的 EPEL(Extra Packages ...
- 算法(Algorithms)第4版 练习 1.3.41
方法实现: //1.3.41 public Queue(Queue<Item> q) { Queue<Item> result = new Queue<Item>( ...
- C++的栈
栈,是一种存储受限的线性数据结构,在存储和访问数据的时候只能访问栈的一端.栈类似于一摞盘子,只能拿去最上面的盘子,也只能把盘子放到最上面.由于这种特点,栈是一种后进先出(Last in / First ...