一、缺省參數(shù)
1.缺省參數(shù)定義
缺省參數(shù)是在函數(shù)的聲明中給定參數(shù)一個指定的值。
如果傳參沒有給定參數(shù),那就按照聲明中默認的缺省值,如果給定了參數(shù),那就按照給定的參數(shù)值。
比如:
using namespace std;
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); // 沒有傳參時,使用參數(shù)的默認值
Func(10); // 傳參時,使用指定的實參
return 0;
}
對于Func函數(shù)如果沒有給定參數(shù),那就按照默認的缺省值來賦值。如果給定了參數(shù),那就按照給定的參數(shù)進行賦值。
2.缺省參數(shù)分類
2.1全缺省參數(shù)
全缺省參數(shù)是所有的參數(shù)都給定缺省值。
void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
比如上面的函數(shù)參數(shù)就是全缺省參數(shù)。
2.2半缺省參數(shù)
半缺省參數(shù)是給定部分缺省值,不一定是給定一半。
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
注意:1.給定半缺省參數(shù)必須從右往左給?。?!
注意:1.給定半缺省參數(shù)必須從右往左給?。?!
注意:1.給定半缺省參數(shù)必須從右往左給!??!
比如:
void Func(int a =10, int b = 10, int c)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
這樣是錯誤的
也不能間隔著給,比如:
void Func(int a = 10 , int b, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
這樣也是錯誤的。
注意:2.也不能在聲明和定義中同時給定缺省值??!
注意:2.也不能在聲明和定義中同時給定缺省值??!
注意:2.也不能在聲明和定義中同時給定缺省值??!
二、函數(shù)重載
1.函數(shù)重載概念
函數(shù)重載是在同一作用域中具有幾個功能相同且同名的函數(shù),這些函數(shù)中具有不同的參數(shù)(包括參數(shù)類型,參數(shù)數(shù)量,參數(shù)位置)。
2.構成重載的幾種方式
2.1由于函數(shù)參數(shù)類型不同構成重載。
// 參數(shù)類型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
這兩個函數(shù)構成重載,因為兩個函數(shù)同名,且它們的參數(shù)類型不同,上面的Add函數(shù)參數(shù)都是int類型,下面的Add函數(shù)參數(shù)是double類型。
2.2 參數(shù)個數(shù)不同構成重載
void fun()
{
cout << "fun()" << endl;
}
void fun(int a)
{
cout << "fun(int a)" << endl;
}
這兩個函數(shù)構成重載,因為函數(shù)名相同,并且第一個fun函數(shù)參數(shù)個數(shù)為0,第二個fun函數(shù)參數(shù)個數(shù)為int a,為1個。
2.3函數(shù)參數(shù)類型順序不同
// 3、參數(shù)類型順序不同
void fun(int a, char b)
{
cout << "fun(int a,char b)" << endl;
}
void fun(char b, int a)
{
cout << "fun(char b, int a)" << endl;
}
這兩個函數(shù)構成重載,因為函數(shù)名相同,并且第一個fun函數(shù)的參數(shù)類型分別為 int ,char,但是第二個fun函數(shù)的參數(shù)類型分別為char,int。
注意:下面的兩個函數(shù)不構成重載!
void fun(int a, int b)
{
cout << "fun(int a,char b)" << endl;
}
void fun(int b, int a)
{
cout << "fun(char b, int a)" << endl;
}
變量名與函數(shù)是否重載無關!
注意:
1.必須是相同的函數(shù)名
2.返回值不作為函數(shù)重載的條件。也就是返回值與函數(shù)是否重載無關。
比如:
int fun(int a)
{
cout << "fun(int a)" << endl;
return a+b;
}
void fun(int a)
{
cout << "fun(int a)" << endl;
}
int main()
{
fun(1)
fun(2)
}
假如要調(diào)用函數(shù)時,編譯器就不知道該找哪個了。
為什么會有函數(shù)重載及其原理
對于C語言來說,是不支持函數(shù)重載的,C語言不允許出現(xiàn)兩個同名的函數(shù)。
為了彌補這一缺陷,C++設計成可以使用同名函數(shù)來解決C語言的缺陷。
函數(shù)重載的原理:
我們知道.c文件生成.exe文件會分成幾步:
1、 .c文件經(jīng)過預處理器進行預處理生成 .i文件。
2、.i文件再經(jīng)過編譯器進行編譯后,生成.s文件,該階段會進行一些語法分析,詞法分析,語義分析,符號匯總等操作。
3、.s文件再經(jīng)過匯編器進行匯編操作后生成.o文件,該階段會將代碼翻譯成匯編指令,再翻譯成機器碼。
在匯編階段,會生成一張符號表,這張符號存儲著被初始化了的全局變量,未被初始化的全局變量,變量名,變量的字節(jié)偏移量,函數(shù)名,還有地址等。
4、鏈接階段,.o文件經(jīng)過鏈接器的鏈接后,會生成.exe可執(zhí)行程序。在這個階段,鏈接器會將不同的.o文件的符號表等數(shù)據(jù)進行合并和重定位等。
**所以:函數(shù)名的地址是在匯編完成后生成的。**所以對于不同的函數(shù)名。比如:
在main.c文件對sum這個函數(shù)進行了聲明,但是聲明不會獲得該函數(shù)的地址,而在sum.c文件中,經(jīng)過了鏈接器的連接之后,將sum.o和main.o文件進行了符號表的合并,獲取到了sum這個函數(shù)的地址,從而對該函數(shù)進行調(diào)用。
C++編譯器中,對于同名的函數(shù),在編譯階段,C++的編譯器會對這兩個同名的函數(shù)進行函數(shù)名修飾
不同的編譯器對函數(shù)名的修飾規(guī)則不同,以Linux的gcc(c語言編譯器)和g++(c++編譯器)兩個編譯器為例。
gcc編譯器對圖中的函數(shù)的編譯結果為右邊:
g++編譯器對圖中的函數(shù)的編譯結果為右邊:
可以明顯地看到,g++對函數(shù)做了修飾,編譯后不再是原來的函數(shù)名了。
g++修飾規(guī)則:【_Z+函數(shù)長度+函數(shù)名+類型首字母】
在linux下,采用g++編譯完成后,函數(shù)名字的修飾發(fā)生改變,編譯器將函數(shù)參
數(shù)類型信息添加到修改后的名字中。文章來源:http://www.zghlxwxcb.cn/news/detail-428848.html
通過這里就理解了C語言沒辦法支持重載,因為同名函數(shù)沒辦法區(qū)分。而C++是通過函數(shù)修飾規(guī)則來區(qū)分,只要參數(shù)不同,修飾出來的名字就不一樣,就支持了重載。文章來源地址http://www.zghlxwxcb.cn/news/detail-428848.html
到了這里,關于【初識C++】(缺省參數(shù)和函數(shù)重載)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!