默认参数与函数重载

一、默认参数
在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, int d=5)  错误,未按照从右到左设定默认值。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> 
      using namespace 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 abs(int x)  //求int型数据的绝对值 
   { 
         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个函数,出现二义性

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

时间: 2024-12-28 00:15:59

默认参数与函数重载的相关文章

C++函数:默认参数的函数

1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参.例如: void delay(int loops); //函数声明 void delay(int loops) //函数定义 { if(100ps==0) return; for(int i=0;i<loops,i++); } 无论何时调用delay()函数,都必须给loops传一个值以确定时间.但有时需要用相同的实参反复调用delay()函数.C++可以给参数定义默认值.如果将delay(

c++有默认参数的函数---4

原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参.例如: void delay(int loops): //函数声明 void delay(int loops) //函数定义 { if(100ps==0) return: for(int i=0;i<loops,i++): } 无论何时调用delay()函数,都必须给loops传一个值以确定时间.但

默认参数的函数

1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参.例如: void delay(int loops): //函数声明 void delay(int loops) //函数定义 { if(100ps==0) return: for(int i=0;i<loops,i++): } 无论何时调用delay()函数,都必须给loops传一个值以确定时间.但有时需要用相同的实参反复调用delay()函数.C++可以给参数定义默认值.如果将delay(

重载函数和默认参数的函数

代码说事 重载的参数匹配 1 /// *重载的匹配顺序 1: 严格匹配 2: 转换匹配 2 /// *重申 : 重载的判断依据 !形参的! 个数 类型 位置 3 /// * 返回值类型不作为重载依据 4 /// * 默认参数 不能用于区分重载函数 5 6 #include <bits/stdc++.h> 7 using namespace std; 8 9 /// 转换 的匹配 10 double b; 11 void print(int a); 12 void print(char c);

[C++程序设计]有默认参数的函数

实参与形参的结合是从左至右顺序进行的.因此指定默认值的参数必须放在形参表列中的最右端,否 则出错.例如: void f1(float a,int b=0,int c,char d=′a′); //不正确 void f2(float a,int c,int b=0, char d=′a′); //正确 在调用有默认参数的函数时,实参的个数可以与形参的个数不同,实参未给定的,从形参的默认值得到值 1 #include <iostream> 2 using namespace std; 3 4 in

sdut 面向对象程序设计上机练习三(有默认参数的函数)

面向对象程序设计上机练习三(有默认参数的函数) Time Limit: 1000MS Memory limit: 65536K 题目描述 利用默认参数的函数实现求2个或3个整数的最大值. 输入 输入3个int型整数. 输出 输出第1.2个整数及其最大值: 输出第1.2.3个整数及其最大值. 示例输入 88 66 99 示例输出 88 66 88 88 66 99 99 既然题目要求是调用默认的函数,就不用自己去定义了: 机智灵活的运用默认函数.. #include <iostream> usi

PHP_零基础学php_3PHP函数、传参函数、默认参数、函数返回值

<?php function say_hello() //无参数 { $name="tang"; echo "hello,".$name; echo "<br />"; echo "<hr />"; } say_hello();//函数调用 function say_helloS($some_name)//有参数 { echo "hello,".$some_name; echo

c++-内联函数和函数重载和默认参数和函数指针

内联函数 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数. 如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义.如果已定义的函数多于一行,编译器会忽略 inline 限定符. 在类定义中的定义的函数都是内联函数,即使没有使用 inline 说

内联函数、默认参数和函数占位参数

内联函数 定义:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质.内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处.编译时,类似宏替换,使用函数体替换调用处的函数名.一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理. C++中的const常量可以替代宏常数定义,如: const int A = 3; ? #define A 3 C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以避免宏的副作用!) C++