国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
默認參數(shù)與函數(shù)重載,及函數(shù)匹配

一、默認參數(shù)
在C++中,可以為參數(shù)指定默認值。在函數(shù)調(diào)用時沒有指定與形參相對應的實參時, 就自動使用默認參數(shù)。

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

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

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

 

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

參數(shù)表的不同表現(xiàn)為:
1、參數(shù)類型不同;
2、參數(shù)個數(shù)不同;

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

例:

#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的函數(shù)來描述int類型和操作的和float類型和操作,方便對相同或者相似功能函數(shù)的管理!
那么,計算機該如何來判斷同名稱函數(shù)呢?操作的時候會不會造成選擇錯誤呢?
回答是否定的,c++內(nèi)部利用一種叫做名稱粉碎的機智來內(nèi)部重命名同名函數(shù),上面的例子在計算重命名后可能會是testii和testff ,他們是通過參數(shù)的類型或個數(shù)來內(nèi)部重命名的。

 

1、參數(shù)類型不同的例子:
(1)
#include<iostream>

using namespace std;


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

 

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

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

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

}

 

2、參數(shù)個數(shù)不同的例子:求2~4個整數(shù)當中的最大值,根據(jù)參數(shù)個數(shù)的不同調(diào)用不同的max()函數(shù)
#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;
}

函數(shù)重載的注意事項

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

 

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

func(2);                  //可調(diào)用前3個函數(shù),出現(xiàn)二義性
func(2.0);              //可調(diào)用后2個函數(shù),出現(xiàn)二義性

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

 

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

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

聯(lián)系客服