欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
默認參數與函數重載,及函數匹配

一、默認參數
在C++中,可以為參數指定默認值。在函數調用時(shí)沒(méi)有指定與形參相對應的實(shí)參時(shí), 就自動(dòng)使用默認參數。

默認參數的語(yǔ)法與使用:
(1)在函數聲明或定義時(shí),直接對參數賦值。這就是默認參數;
(2)在函數調用時(shí),省略部分或全部參數。這時(shí)可以用默認參數來(lái)代替。

注意:
(1)默認參數只可在函數聲明中設定一次。只有在無(wú)函數聲明時(shí),才可以在函數定義中設定。
(2)默認參數定義的順序為自右到左。即如果一個(gè)參數設定了缺省值時(shí),其右邊的參數都要有缺省值。
如: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沒(méi)有缺省值。
(3)默認參數調用時(shí),則遵循參數調用順序,自左到右逐個(gè)調用。這一點(diǎn)要與第(2)分清楚,不要混淆。
如:void mal(int a, int b=3, int c=5);      //默認參數
        mal(3, 8, 9 );                                      //調用時(shí)有指定參數,則不使用默認參數
        mal(3, 5);                  //調用時(shí)只指定兩個(gè)參數,按從左到右順序調用,相當于mal(3,5,5);
        mal(3);                      //調用時(shí)只指定1個(gè)參數,按從左到右順序調用,相當于mal(5,3,5);
        mal(  );                      //錯誤,因為a沒(méi)有默認值
        mal(3,  , 9)               //錯誤,應按從左到右順序逐個(gè)調用
再如: void mal(int a=8, int b=3, int c=5);      //默認參數
             mal(  );                                                      //正確,調用所有默認參數,相當于mal(8,3,5);

(4)默認值可以是全局變量、全局常量,甚至是一個(gè)函數。但不可以是局部變量。因為默認參數的調用是在編譯時(shí)確定的,而局部變量位置與默認值在編譯時(shí)無(wú)法確定。

 

二、函數重載
在相同的聲明域中,函數名相同,而參數表不同。通過(guò)函數的參數表而唯一標識并且來(lái)區分函數的一種特殊的函數用法。

參數表的不同表現為:
1、參數類(lèi)型不同;
2、參數個(gè)數不同;

特別注意:返回類(lèi)型不同不可以作為函數重載的標識。

例:

#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; 
}
 

在上面的程序中,用了兩個(gè)名為test的函數來(lái)描述int類(lèi)型和操作的和float類(lèi)型和操作,方便對相同或者相似功能函數的管理!
那么,計算機該如何來(lái)判斷同名稱(chēng)函數呢?操作的時(shí)候會(huì )不會(huì )造成選擇錯誤呢?
回答是否定的,c++內部利用一種叫做名稱(chēng)粉碎的機智來(lái)內部重命名同名函數,上面的例子在計算重命名后可能會(huì )是testii和testff ,他們是通過(guò)參數的類(lèi)型或個(gè)數來(lái)內部重命名的。

 

1、參數類(lèi)型不同的例子:
(1)
#include<iostream>

using namespace std;


void Add(char x,char y){ cout << "字符串是:"<<x<<y<<endl; }
void Add(int x,int y){ cout << "兩數的和是: "<<x+y<<endl; }
void main()
{
    Add('O','k');
    Add(65,100);
}

 

(2)重載函數abs(),求int、float和double類(lèi)型數據的絕對值。
#include <iostream>

using namespace std;
//求int型數據的絕對值
int abs(int x)
{
    if (x<0) x=-x;
    return x;
}
//求float型數據的絕對值
float abs(float x)
{
    if (x<0) x=-x;
    return x;
}
//求 double型數據的絕對值
//仿照上面的函數編寫(xiě)

//主函數
void main()
{
   int a=-357;
   float b=63.85;
   double c=-6974.26;
   cout<<abs(a)<<'\t'<<abs(b)<<'\t'<<abs(c)<<endl;

}

 

2、參數個(gè)數不同的例子:求2~4個(gè)整數當中的最大值,根據參數個(gè)數的不同調用不同的max()函數
#include<iostream>

using namespace std;


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)
{
//自行編制這部分代碼
}
void main()
{
    cout<<max(1,2)<<endl;
    cout<<max(1,2,3)<<endl;
    cout<<max(1,2,3,4)<<endl;
}

函數重載的注意事項

1、函數的形參必須不同,或者個(gè)數不同,或者類(lèi)型不同,不能夠只依靠函數的返回值類(lèi)型不同或形參變量名不同來(lái)實(shí)現函數重載。
2、不要將不同功能的函數定義為重載函數,以免出現對調用結果的誤解。如:
int add(int x,int y){return x+y;}
float add(float x,float y){return x-y;}

 

重載函數與默認參數重疊導致的二義性問(wèn)題:
func(int);                                                                               //重載函數1,只有1個(gè)參數,無(wú)默認參數
func(int, int =4);                                                                   //重載函數2,有2個(gè)參數,有1個(gè)默認參數
func(int a=3, int b=4, int c=6);                                          //重載函數3,有3個(gè)參數,有3個(gè)默認參數
fucn(float a=3.0, float b=4.0 float c=5.0);                               //重載函數4,有3個(gè)參數,有3個(gè)默認參數
fucn(float a=3.0, float b=4.0 float c=5.0 float d=7.9 );          //重載函數5,有4個(gè)參數,有4個(gè)默認參數

func(2);                  //可調用前3個(gè)函數,出現二義性
func(2.0);              //可調用后2個(gè)函數,出現二義性

所以當重載函數與默認參數共同使用時(shí),要注意出現二義性問(wèn)題。

 

重載函數的調用匹配(二義性問(wèn)題)
函數調用時(shí)從來(lái)沒(méi)有在匹配上冒出過(guò)大問(wèn)題,直到重載概念的到來(lái)。因為重載函數允許一批函數共用一個(gè)函數名。
  以往調用函數是依賴(lài)函數名的,直接找到對應的函數名,檢查一下參數個(gè)數和類(lèi)型是否符合即可?,F在就只好憑函數名和參數一起來(lái)確定該調用哪個(gè)函數了。
  若是憑參數能唯一確定函數那自然好,可是參數還存在類(lèi)型轉換與區配的問(wèn)題。這就增加了函數匹配的難度,有時(shí)甚至明明有多個(gè)函數供選擇卻找不到能匹配的。
  書(shū)上為重載確定整理了以下幾個(gè)步驟:“候選函數”、“選擇可行函數”、“尋找最佳匹配”。其實(shí)這里面真正難以對付的是“尋找最佳匹配”。下面分述之:
  第一步“候選函數”是憑函數名進(jìn)行篩選。簡(jiǎn)單說(shuō)就是找出所有的同名函數。當然,如果僅僅按是否同名來(lái)判斷將面臨問(wèn)題,因為函數有不同的作用域。嚴格說(shuō)來(lái)就是下面這句話(huà):
  引用:候選函數是與被調用函數同名的函數,并且在調用點(diǎn)上,它的聲明可見(jiàn)。
  第二步“選擇可行函數”是按參數的個(gè)數進(jìn)行篩選。參數的個(gè)數是明確的條件,這就減少了產(chǎn)生分歧的可能性。當然,分歧還是會(huì )有的,那就是有些函數允許缺省參數。比如:
void f(int i);//函數一
void f(int i, int j=0);//函數二
f(1, 2);//調用一
f(1);//調用二
  以上兩個(gè)重載函數究竟會(huì )不會(huì )產(chǎn)生調用分歧,僅憑函數還不能判。如果只有調用一,則它們是沒(méi)有沖突的,但是如果有調用二,則在調用二的點(diǎn)上會(huì )產(chǎn)生“二義性”。
  第三步是難點(diǎn),怎樣尋找最佳匹配?如果能找到某個(gè)重載,它的參數個(gè)數和參數類(lèi)型完全與調用一致,則它就是“最佳”。但是事實(shí)上有兩種情況會(huì )導致不確定性:一是字面值常量沒(méi)有明確的類(lèi)型,二是變量的類(lèi)型可以轉換。
  先說(shuō)字面值常量,比如“f('a');”的參數就是一個(gè)字面值常量。它究竟是char型還是unsigned char型?再比如“f(1);”的參數,它究竟是int、unsigned int、long還是unsigned long?
  對于變量來(lái)說(shuō),它有明確的類(lèi)型,但是如果在可行函數中不存在完全相同的類(lèi)型,就要面臨轉換的問(wèn)題,轉換是多種多樣的,一個(gè)int既可以轉為 unsigned int也可以轉為long,甚至還可以轉化為float或double。那么,多種轉換之間就要尋找一個(gè)“最佳”。
  簡(jiǎn)單地說(shuō),除了類(lèi)型“精確匹配”以外,類(lèi)型的“提升”是優(yōu)于“降級”的。那么,能否找到類(lèi)型的提升就是關(guān)鍵了。對于含有多個(gè)參數的函數,有時(shí)就更難遷就每一個(gè)參數了。比如:
void f(int, int);//函數一
void f(double, double);//函數二
f(42, 2.56);//調用一
  上面的例子中,對于調用一,兩個(gè)函數沒(méi)有哪一個(gè)比另一個(gè)優(yōu)。
  引用:區配成功的條件為有且僅有一個(gè)函數滿(mǎn)足下列條件:(1)每個(gè)實(shí)參的匹配都不劣于其它可行函數需要的匹配。(2)至少有一個(gè)實(shí)參的匹配優(yōu)于其它可行函數提供的匹配。
  說(shuō)到底,重載函數之所以在調用的時(shí)候有這么大的麻煩,原因還在于多個(gè)函數共用一個(gè)函數名。有一點(diǎn)還需要拿出來(lái)彈調一下:雖然它們函數名相同,但它們是不同的函數。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C++對C語(yǔ)言的非面向對象特性擴充(2)
C和C++__帶默認值參數的函數說(shuō)明
學(xué)習C++ -> 構造函數與析構函數
01、C++函數的高級用法
模板
C++缺省參數和函數重載
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久