C++默认参数与函数重载

一、默认参数
在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。

默认参数的语法与使用:
(1)在函数声明或定义时,直接对参数赋值。这就是默认参数;
(2)在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。

注意:
(1)默认参数只可在函数声明中设定一次。只有在无函数声明时,才可以在函数定义中设定。
(2)默认参数定义的顺序为自右到左。即如果一个参数设定了缺省值时,其右边的参数都要有缺省值。
如:int mal(int a, int b=3, int c=6, int d=8)    正确,按从右到左顺序设定默认值。
        int mal(int a=6, int b=3, int c=5, int d)   错误,未按照从右到左设定默认值。c设定缺省值了,而其右边的d没有缺省值。
(3)默认参数调用时,则遵循参数调用顺序,自左到右逐个调用。这一点要与第(2)分清楚,不要混淆。
如:void mal(int a, int b=3, int c=5);      //默认参数
         mal(3, 8, 9 );                                       //调用时有指定参数,则不使用默认参数
        mal(3, 5);                   //调用时只指定两个参数,按从左到右顺序调用,相当于mal(3,5,5);
        mal(3);                       //调用时只指定1个参数,按从左到右顺序调用,相当于mal(5,3,5);
         mal( );                      //错误,因为a没有默认值
         mal(3, , 9)                //错误,应按从左到右顺序逐个调用
再如: void mal(int a=8, int b=3, int c=5);      //默认参数
              mal( );                                                      //正确,调用所有默认参数,相当于mal(8,3,5);

(4)默认值可以是全局变量、全局常量,甚至是一个函数。但不可以是局部变量。因为默认参数的调用是在编译时确定的,而局部变量位置与默认值在编译时无法确定。

二、函数重载
在相同的声明域中,函数名相同,而参数表不同。通过函数的参数表而唯一标识并且来区分函数的一种特殊的函数用法。

参数表的不同表现为:
1、参数类型不同;
2、参数个数不同;

特别注意:返回类型不同不可以作为函数重载的标识。

例:

#include <iostream>
usingnamespace std; 
int test(int a,int b); 
float test(float a,float b); 
void main() 
...{ 
cout << test(1,2) << endl << test(2.1f,3.14f) << endl; 
cin.get(); 
}

int test(int a,int b) 
...{ 
return a+b; 
}

float test(float a,float b) 
...{ 
return a+b; 
}

在上面的程序中,用了两个名为test的函数来描述int类型和操作的和float类型和操作,方便对相同或者相似功能函数的管理! 
那么,计算机该如何来判断同名称函数呢?操作的时候会不会造成选择错误呢? 
回答是否定的,c++内部利用一种叫做名称粉碎的机智来内部重命名同名函数,上面的例子在计算重命名后可能会是testii和testff ,他们是通过参数的类型或个数来内部重命名的。

1、参数类型不同的例子:
(1)
#include<iostream.h> 
void Add(char x,char y) 
{cout<<"字符串是:"; 
cout<<x<<y<<endl; 

void Add(int x,int y) 
{cout<<"两数的和是: "; 
cout<<x+y<<endl; 

void main() 

Add('O','k'); 
Add(65,100); 
}

(2)重载函数abs(),求int、float和double类型数据的绝对值。
#include <iostream.h> 
//求int型数据的绝对值 
int abs(int x) 

if (x<0) x=-x; 
return x; 

//求float型数据的绝对值 
float abs(float x) 

if (x<0) x=-x; 
return x; 

//求 double型数据的绝对值 
//仿照上面的函数编写

//主函数 
void main() 

int a=-357; 
float b=63.85; 
double c=-6974.26; 
cout<<abs(a)<<'\t'<<abs(b)<<'\t'<<abs(c)<<endl;

2、参数个数不同的例子:求2~4个整数当中的最大值,根据参数个数的不同调用不同的max()函数
#include<iostream.h> 
int max(int x,int y) 

if(x>y) return x; 
else return y; 

int max(int x,int y,int z) 

int a=max(x,y); 
return max(a,z); 

int max(int a,int b,int c,int d) 

//自行编制这部分代码 

main() 

cout<<max(1,2)<<endl; 
cout<<max(1,2,3)<<endl; 
cout<<max(1,2,3,4)<<endl; 
}

函数重载的注意事项

1、函数的形参必须不同,或者个数不同,或者类型不同,不能够只依靠函数的返回值类型不同或形参变量名不同来实现函数重载。
2、不要将不同功能的函数定义为重载函数,以免出现对调用结果的误解。如:
int add(int x,int y){return x+y;}
float add(float x,float y){return x-y;}

重载函数与默认参数重叠导致的二义性问题:
func(int);                                                                               //重载函数1,只有1个参数,无默认参数
func(int, int =4);                                                                   //重载函数2,有2个参数,有1个默认参数
func(int a=3, int b=4, int c=6);                                            //重载函数3,有3个参数,有3个默认参数
fucn(float a=3.0, float b=4.0 float c=5.0);                             //重载函数4,有3个参数,有3个默认参数
fucn(float a=3.0, float b=4.0 float c=5.0 float d=7.9 );          //重载函数5,有4个参数,有4个默认参数

func(2);                  //可调用前3个函数,出现二义性
func(2.0);               //可调用后2个函数,出现二义性

所以当重载函数与默认参数共同使用时,要注意出现二义性问题。

转载于:https://blog.51cto.com/yaoyong2012/940776

C++默认参数与函数重载相关推荐

  1. C++离航篇——函数默认参数、函数重载、内敛函数

    1.函数的默认参数 2.函数的重载 (1)在相同的作用域内,用同一个函数名定义的多个函数,其中每个函数的参数个数.参数类型不同. 3.内联函数 (1)编译的时候,将函数体代码和相应的实参直接在函数调用 ...

  2. C++PrimerPlus 学习笔记 | 第八章 函数探幽 |3.默认参数 4.函数重载

    默认参数 默认参数是指当函数调用的时候省略了实参自动使用的一个值. // 函数原型 void wow(int n = 1); // 如果这样调用函数等价于 wow(1) wow() // == wow ...

  3. C++笔记(16)函数默认参数和函数重载

    1.默认参数 默认参数指的是函数调用时省略了一个实参时,自动使用默认值.函数默认值的设置,必须通过函数原型,方法是将默认值赋给原型中的参数.注意,对含有多个参数的函数,默认值必须放在右边,即如果某一位 ...

  4. 【C++笔记】函数的用法:函数的默认参数、占位参数、函数重载

    函数的默认参数 在C++中,函数的形参列表中的形参是可以有默认值的. 语法:返回值类型 函数名 (参数=默认值){} int func(int a, int b = 20, int c = 30){r ...

  5. C++函数默认参数(函数传入实参个数比形参个数少)

    C++函数默认参数 定义 参数添加顺序 注意事项 转载链接 定义     在C++中,定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的 ...

  6. c语言带默认参数吗,嵌入式C语言可以带“默认参数”的函数吗

    (文章来源:嵌入式时代) 使用C++开发过程序时,定义函数可以指定默认参数,例如 void fun(int x, int y=3); 在调用 fun() 时第二个参数可以不传递,此时 fun() 函数 ...

  7. c语言支持默认参数吗,嵌入式C语言可以带“默认参数”的函数吗

    描述 (文章来源:嵌入式时代) 使用C++开发过程序时,定义函数可以指定默认参数,例如 void fun(int x, int y=3); 在调用 fun() 时第二个参数可以不传递,此时 fun() ...

  8. c语言默认参数_5.1 C++有默认参数的函数

    点击上方"C语言入门到精通",选择置顶 第一时间关注程序猿身边的故事 作者 闫小林 白天搬砖,晚上做梦.我有故事,你有酒么? C++有默认参数的函数在函数调用时形参从实参获取值,因 ...

  9. js有默认参数的函数加参数_函数参数:默认,关键字和任意

    js有默认参数的函数加参数 PYTHON开发人员的提示 (TIPS FOR PYTHON DEVELOPERS) Think that you are writing a function that ...

最新文章

  1. 剑指offer六十一之序列化二叉树(待补充)
  2. 第07课:动手实战基于 ML 的中文短文本聚类
  3. php与ie通信,php 获取用户IP与IE信息程序
  4. wooden sticks
  5. J2EE的13种核心技术(一)
  6. python可能导致异常的代码_Python程序可能导致文件系统错误?
  7. pscc2018教程photoshop软件全套入门到精通分享
  8. 5. find操作详解
  9. 计算机软件技术就业方向,软件技术的就业前景和就业方向
  10. Machine Learning读书会,面试算法讲座,创业活动,算法班(15年6月)
  11. ★★★Win10切换本地账户(最全版本)
  12. 算法基础部分-二叉树
  13. canvas 制作简易涂鸦画板(教程)
  14. 头歌Educoder——Java高级特性 - JDBC(上)
  15. ubuntu18.04安装详解
  16. PMP项目管理-PMP答题思路
  17. crm订单管理系统有哪些?
  18. CSS学习笔记|MDN-CSS选择器
  19. 热烈祝贺安徽省快递协会加入2023上海快递物流展
  20. HarmonyOS开发者创新大赛获奖作品分享——《分镜头App》

热门文章

  1. 生了娃照样能打,两位母亲温网会师
  2. Java与C/C++的比较(转)
  3. 图像检索:几种基于纹理特征的图像检索算法
  4. LBS应用的路径引导方法
  5. Graph Cut and Its Application in Computer Vision
  6. 网狐荣耀版通过水浒传基础二开埃及拉霸和水果森林步骤
  7. 如何开启Windows 10隐藏的锁屏时间设置项
  8. 微软回应 CIA 漏洞攻击 Win10 问题:正在研究维基解密报告
  9. Linux的I/O多路复用机制之--selectpoll
  10. 鼠标滚轮 控制作用滚动