預設參數與函數重載

來源:互聯網
上載者:User

標籤:

一、預設參數
在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個函數,出現二義性

 

所以當重載函數與預設參數共同使用時,要注意出現二義性問題。

預設參數與函數重載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.