C++預設引數與函式過載及注意事項
一、預設引數
在C++中,可以為引數指定預設值。在函式呼叫時沒有指定與形參相對應的實參時, 就自動使用預設引數。
預設引數的語法與使用:
(1)在函式宣告或定義時,直接對引數賦值。這就是預設引數;
(2)在函式呼叫時,省略部分或全部引數。這時可以用預設引數來代替。
注意:
(1)預設引數只可在函式宣告中設定一次。只有在沒有函式宣告時,才可以在函式定義中設定。(#add,此句意為存在函式宣告和定義兩部分的時候。驗證表明有這個限制,可以隨便,但出於規範,在宣告中指定)
(2)如果一個引數設定了預設值時,其右邊的引數都要有預設值。(#add 這是定義時,類的成員函式的引數表在宣告時預設引數位於引數表右部,使用時該怎樣待總結)
int mal(int a=6,int c=5,int d) 錯誤,未按照從右到左設定預設值。c設定預設值了,而其右邊的d沒有預設值。
(3)預設引數呼叫時,則遵循引數呼叫順序,自左到右逐個呼叫。這一點要與第(2)分清楚,不要混淆。(#add 神馬意思啊? 暫理解為兩個預設引數之間的引數必須賦預設值,錯,意為呼叫函式時,從左至右第一個實參即為第一個形參的實參,依此類推)
如:
void mal(int a,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 c=5); //預設引數 mal( ); //正確,呼叫所有預設引數,相當於mal(8,5);
(4)預設值可以是全域性變數、全域性常量,甚至是一個函式。但不可以是區域性變數。因為預設引數的呼叫是在編譯時確定的,而區域性變數位置與預設值在編譯時無法確定。
二、函式過載
在相同的宣告域中,函式名相同,而引數表不同。通過函式的引數表而唯一標識並且來區分函式的一種特殊的函式用法。
引數表的不同表現為:
1、引數型別不同;
2、引數個數不同;
特別注意:返回型別不同不可以作為函式過載的標識。
函式過載的注意事項
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個函式,出現二義性
所以當過載函式與預設引數共同使用時,要注意出現二義性問題。
總結
到此這篇關於C++預設引數與函式過載及注意事項的文章就介紹到這了,更多相關C++預設引數 函式過載內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!