C++复习(三)
2016-01-27 00:00
204 查看
C++函数重载
实际开发中,有时我们要实现的是同一类的功能,只是有些细节不同。例如希望从3个数中找出其中的最大者,而每次求最大数时数据的类型不同,可能是3个整数、3个双精度数或3个长整数。在C语言中,程序员往往需要分别设计出3个不同名的函数,其函数原型与下面类似:int max1(int a, int b, int c); //求3个整数中的最大者
double max2(double a, double b, double c); //求3个双精度数中最大者
long max3(long a, long b, long c); //求3个长整数中的最大者
但在C++中,这完全没有必要。C++允许多个函数拥有相同的名字,只要它们的参数列表不同就可以。这就是函数的重载(Function Overloading)。借助重载,一个函数名可以有多种用途。
参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。
【例4.6】求三个数的最大值:
#include <iostream>
using namespace std;
//函数声明
int max(int, int, int);
double max(double, double, double);
long max(long, long, long);
int main( )
{
//求三个整数的最大值
int i1, i2, i3, i_max;
cin >> i1 >> i2 >> i3;
i_max = max(i1,i2,i3);
cout << "i_max=" << i_max << endl;
//求三个浮点数的最大值
double d1, d2, d3, d_max;
cin >> d1 >> d2 >> d3;
d_max = max(d1,d2,d3);
cout << "d_max=" << d_max << endl;
//求三个长整型数的最大值
long g1, g2, g3, g_max;
cin >> g1 >> g2 >> g3;
g_max = max(g1,g2,g3);
cout << "g_max=" << g_max << endl;
}
//求三个整数的最大值
int max(int a, int b, int c)
{
if(b>a) a=b;
if(c>a) a=c;
return a;
}
//求三个浮点数的最大值
double max(double a, double b, double c)
{
if(b>a) a=b;
if(c>a) a=c;
return a;
}
//求三个长整型数的最大值
long max(long a, long b, long c)
{
if(b>a) a=b;
if(c>a) a=c;
return a;
}
运行结果:
12 34 100↙
i_max=100
73.234 90.2 878.23↙
d_max=878.23
344 900 1000↙
g_max=1000
通过上例可以发现,重载就是在一个作用范围内(同一个类、同一个命名空间等),有多个名称相同但参数不同的函数。重载的结果,可以让一个程序段尽量减少代码和方法的种类。
在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能,虽然程序也能运行,但可读性不好,使人莫名其妙。
说明:参数列表不同包括个数不同、类型不同和顺序不同,仅仅参数变量名称不同是不可以的。
函数的重载的规则:
函数名称必须相同。
参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
函数的返回类型可以相同也可以不相同。
仅仅返回类型不同不足以成为函数的重载。
函数重载的实现
C++ 代码在编译时会根据参数列表对函数进行重命名,例如,int max(int, int, int) 会被重命名为 _max_int_int_int,double max(double, double, double) 会被重命名为 _max_double_double_double,所以在本质上来说它们还是不同的函数。
C++函数的默认参数
在C++中,定义函数时可以给参数指定一个默认的初始值。调用函数时,可以省略有默认值的参数。也就是说,如果用户指定了参数的值,那么就使用用户指定的值,否则使用参数的默认值。指定了默认值的参数,称为默认参数。请看下面的例子:
#include<iostream>
using namespace std;
//带默认参数的函数
void func(int n, float b=1.2, char c='@'){
cout<<n<<", "<<b<<", "<<c<<endl;
}
int main(){
//为所有参数传值
func(10, 3.5, '#');
//为n、b传值,相当于调用func(20, 9.8, '@')
func(20, 9.8);
//只为n传值,相当于调用func(30, 1.2, '@')
func(30);
return 0;
}
运行结果:
10, 3.5, #
20, 9.8, @
30, 1.2, @
本例定义了一个带有默认参数的函数 func(),并在 main() 函数中进行了不同形式的调用。为参数指定默认值非常简单,直接在形参列表中赋值即可,与定义普通变量的形式类似。
默认参数的值除了使用字面量指定,也可以使用表达式指定,例如:
float d = 10.8;
void func(int n, float b=d+2.9, char c='@'){
cout<<n<<", "<<b<<", "<<c<<endl;
}
C++规定,默认参数只能放在形参列表的最后,而且一旦为某个参数指定了默认值,那么它后面的所有参数都必须有默认值。实参和形参的传值是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提。
下面的写法是正确的:
void func(int a, int b=10, int c=20){ }
void func(int a, int b, int c=20){ }
但这样写不可以:
void func(int a, int b=10, int c=20, int d){ }
void func(int a, int b=10, int c, int d=20){ }
除了函数定义,你也可以在函数声明中指定默认参数。不过默认参数只能指定一次,在声明中指定了就不能在定义中指定,反过来也一样。请看下面的例子:
#include<iostream>
using namespace std;
void func(int a, int b=10, int c=20);
int main(){
func(20, 30);
return 0;
}
//不能再指定默认参数
void func(int a, int b, int c){
cout<<a<<", "<<b<<", "<<c<<endl;
}
运行结果:
20, 30, 20
相关文章推荐
- C++与STL再回顾
- c++类的继承
- [LeetCode] 105 & 106
- C++学习笔记47——继承中的访问权限汇总
- C++入门小程序练习
- C语言链表的简单实用
- VS2013中带命令行参数的调试方法
- C++ stringstream的用法|c++ 字符串流 sstream(常用于格式转换)
- 一起talk C栗子吧(第一百一十三回:C语言实例--线程同步之信号量一)
- 常见C语言知识要点
- HDU 1003 Max Sum (最大子序列的和)
- C++ DirectX 游戏开发初级视频教程 17 资源下载链接
- socket通信简介
- 二叉树的迭代前中后遍历以及不用栈的遍历C语言
- 13.IDA-显示正确的函数名称(去掉c++后缀命名)
- CPP 1014 Fans数
- 二分查找的实现
- 有关模板的一些注意情况
- G++和C++的区别
- C++ Socket编程步骤