C++默認參數與函數重載 注意事項

  C++默認參數與函數重載 注意事項


1、默認參數
在C++中,能夠爲參數指定默認值。在函數調用時沒有指定與形參相對應的實參時, 就自動使用默認參數。

默認參數的語法與使用:
(1)在函數聲明或定義時,直接對參數賦值。這就是默認參數;
(2)在函數調用時,省略部分或所有參數。這時能夠用默認參數來代替。
函數

注意:
(1)默認參數只可在函數聲明中設定一次。只有在沒有函數聲明時,才能夠在函數定義中設定。(#add ,此句意爲存在函數聲明和定義兩部分的時候。驗證代表有這個限制,能夠隨便,但出於規範,在聲明中指定)
(2)若是一個參數設定了缺省值時,其右邊的參數都要有缺省值。(#add 這是定義時,類的成員函數的參數表在聲明時默認參數位於參數表右部,使用時中間默認值可省麼?)

如: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)分清楚,不要混淆。(#add 神馬意思啊? 暫理解爲兩個默認參數之間的參數必須賦缺省值, 錯,意爲調用函數時,從左至右第一個實參賦給第一個形參,依此類推)
如: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); spa

(4)默認值能夠是全局變量、全局常量,甚至是一個函數。但不能夠是局部變量。由於默認參數的調用是在編譯時肯定的,而局部變量位置與默認值在編譯時沒法肯定。 .net

 

2、函數重載
在相同的聲明域中,函數名相同,而參數表不一樣。經過函數的參數表而惟一標識而且來區分函數的一種特殊的函數用法。 blog

參數表的不一樣表現爲:
一、參數類型不一樣;
二、參數個數不一樣;
get

特別注意:返回類型不一樣不能夠做爲函數重載的標識。 it

 

函數重載的注意事項

一、函數的形參必須不一樣,或者個數不一樣,或者類型不一樣,不可以只依靠函數的返回值類型不一樣或形參變量名不一樣來實現函數重載。
二、不要將不一樣功能的函數定義爲重載函數,以避免出現對調用結果的誤解。如:
int add(int x,int y)
編譯

{ class

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個函數,出現二義性 因此當重載函數與默認參數共同使用時,要注意出現二義性問題

相關文章
相關標籤/搜索