c++函数的缺省参数及函数重载

函数的缺省参数

函数在定义或者声明的时候,将参数列表中的某一项或某几项参数给定为默认值,在后续的调用过程中我们可以不给缺省的形参传递实参数据,这样该函数会使用我们在定义或者声明时使用的默认参数。当然你可以传入你自己实际需要的参数这样函数内部就会使用你传入的参数。
注意:

  1. 函数的缺省参数在定义或者声明时给出,且只在一处给出,声明中给了之后就不能在定义中再次给默认参数。
  2. 缺省参数在参数列表中的位置必须是从右向左且连续给出。必须保证无缺省参数在前,缺省参数在后,缺省参数之后不能再出现无缺省参数。
  3. 缺省参数的默认值一般选择全局变量或者常量
    程序实例:
#include <iostream>       
using namespace std;             
int add(int a,int b=0,int c=0);//声明处给出默认值,缺省参数从右向左给出                                                               
int main()      
{      
    cout<<add(1,2,3)<<endl;      
    cout<<add(1,2)<<endl;      
    cout<<add(1)<<endl;    
    return 0;      
}                   
int add(int a,int b,int c)      
{                               
    return a+b+c;      
}   

运行结果:
在这里插入图片描述

函数重载

在C语言中,我们在同一作用域下定义两个同名但功能不同的函数时,会发生重定义错误;但是在c++中引入了函数重载,它解决了同一作用域下不同功能(主要是参数列表不同)函数名冲突的问题,它的区分方法主要是通过因为形参列表,当两个函数名字同名时,c++编译器可以通过参数列表来判断这两个函数是否发生重定义,如果参数列表也相同,那就构成重定义;当形参列表不相同时就不是重定义而是构成了重载关关系。
注意:

  1. 函数的重载关系和缺省无关,当两个函数的名字和参数列表均相同时,其中一个为缺省参数,那么也将发生函数重定义。
  2. 函数的返回值类型和是否重载无关,返回值是否相同对重载是没有影响的
#include <iostream>                                
using namespace std;                               
int add(int a,int b=0,int c=0);//声明处给出默认值,缺省参数从右向左给出      
int  add(int c,int b)                              
{                                                  
    return c+b;                                    
}                                                  
float add(int a,float b)                           
{                                                  
    return a+b;                                    
}                                                  
int main()                                         
{                                                  
    float var=3.4;                                 
    cout<<add(1,2,3)<<endl;                                                
    cout<<add(1)<<endl;                                                     
    cout<<add(1,var)<<endl;    
    return 0;                        
}                               
int add(int a,int b,int c)      
{
    return a+b+c;                                                                                                             
} 

运行结果:
在这里插入图片描述

名字修饰

那么为什么c语言只要函数同名就会出现函数重定义,而c++可以允许函数名相同且不会发生重定义呢?
原因在于c语言和c++的编译过程对函数的名字修饰不同,名字修饰就是在编译过程中编译器将变量、函数等的名称重新改编的机制,重新修饰成为一个全局唯一的名称。那么c原因和c++对于函数的名字修饰不同在什么地方呢?
代码示例:

//.cpp文件
#include <iostream>
#include <array>    
using namespace std;
void add(int, int);
int main()
{
	add(0, 0);
	return 0;
}
//.c文件
#include <stdio.h>
void add(int, int);
int main()
{
	add(0, 0);
	return 0;
}

其中这两个函数都是没有实际定义的,我们来看一次他们的内部标识符是什么样子?
在这里插入图片描述
c++中不光函数名参与了名字修饰,函数的参数列表也参与了名字修饰,这就是c++为什么能够同名函数重载的原因。
我们在使用重载和缺省函数的过程中,注意设计方法和思路,避免冲突,就比如下种情况:

#include <iostream>     
  using namespace std;           
  int add(int a,int b=0,int c=0);//声明处给出默认值,缺省参数从右向左给出
  int  add(int c,int b)
  {
      return c+b;
  }
  int main()
  {
      cout<<add(1,2)<<endl; //调用出错,不知道该调用那个?函数调用发生歧义                                                                                                                                                                                            
      return 0;
  }                                                                                                                           
  int add(int a,int b,int c)       
  {                              
      return a+b+c;                                    
  }

两个add函数是可以构成重载关系,但是看完后你觉得程序编译可以通过吗?
其实在调用add(1,2)时,会出现歧义,这两个函数均可以调用,编译器这时就不知道该调用哪一个了。其实当我们有了缺省参数之后就不需要 int add(int c,int b)函数了,我们只需要将第一个add函数第三个参数的默认值设为0就可以达到同样的功能,而且还可以计算三个数相加,这就是缺省参数出现的意义。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,我们可以使用缺省构造函数来创建一个对象数组。 缺省构造函数是指在定义类时没有显式定义任何构造函数的情况下,默认生成的构造函数。它不带任何参数,并且没有函数体,其作用是为对象提供默认的初始化。 如果我们将一个类定义为数组的元素类型,可以使用缺省构造函数来创建一个对象数组。例如,假设我们有一个名为Person的类,没有任何构造函数的定义。我们可以通过以下方式创建一个Person对象数组: Person arr[5]; 上述代码将创建一个名为arr的Person对象数组,数组中包含了5个Person对象。由于缺省构造函数的存在,每个元素都会被默认初始化为该类的默认值。具体的初始化规则取决于成员变量的类型和定义。如果在Person类中定义了成员变量的默认值,那么每个元素都将被初始化为这些默认值。 如果我们想要自定义初始化每个元素,可以通过重载构造函数的方式来实现。这样,在创建对象数组时,我们也可以传递参数来初始化每个元素。例如,如果我们想要将数组中的每个Person对象的年龄初始化为25岁,可以定义一个带有参数的构造函数,并使用如下方式创建数组: Person arr[5] = { Person(25), Person(25), Person(25), Person(25), Person(25) }; 上述代码将创建一个Person对象数组,其中每个元素的年龄被初始化为25岁。 总结起来,通过使用缺省构造函数,我们可以方便地创建对象数组,并根据需要进行默认初始化或自定义初始化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值