?
Halo,這里是Ppeua。平時(shí)主要更新C語(yǔ)言,C++,數(shù)據(jù)結(jié)構(gòu)算法......感興趣就關(guān)注我吧!你定不會(huì)失望。
??個(gè)人主頁(yè):主頁(yè)鏈接
??算法專欄:專欄鏈接
?????我會(huì)一直往里填充內(nèi)容噠!
??LeetCode專欄:專欄鏈接?
????目前在刷初級(jí)算法的LeetBook 。若每日一題當(dāng)中有力所能及的題目,也會(huì)當(dāng)天做完發(fā)出
??代碼倉(cāng)庫(kù):Gitee鏈接
??點(diǎn)擊關(guān)注=收獲更多優(yōu)質(zhì)內(nèi)容??
目錄
1.缺省參數(shù):
2.函數(shù)重載:
3.引用:
完結(jié)撒花:
?
1.缺省參數(shù):
在C++中
如果想要在一個(gè)函數(shù)不給定具體參數(shù)的情況下使用一個(gè)默認(rèn)值就可以用到缺省參數(shù)這個(gè)概念.
具體用法如下在聲明/定義時(shí)給定默認(rèn)值即可,
int add(int a=0,int b=1);
int add(int a,int b)
{
return a+b;
}
int main()
{
cout<<add(12);
}
例如這里就給定了第一個(gè)參數(shù).而沒(méi)有給第二個(gè)參數(shù),所以默認(rèn)為1,所以A+B的值就變成了13
注意!!
int add(int a=0,int b=1);
int add(int a=0,int b=1)
{
return a+b;
}
不能在聲明與定義同時(shí)給出默認(rèn)參數(shù),即使值是一樣,這樣也是錯(cuò)的.
所以只能在一個(gè)地方(聲明/定義)給定默認(rèn)值.一般在聲明時(shí)給出
可以全部給定默認(rèn)值,也可以只給一部分.但只能從右到左連續(xù)的給出.
int add(int a,int b=1,int c=2)
{
return a+b+c;
}
int main()
{
cout<<add(12);
}
這樣就屬于跳著給,也是不可以的
int add(int a=1,int b,int c=2)
{
return a+b+c;
}
2.函數(shù)重載:
在C中,若想要使用使用一個(gè)add函數(shù)返回兩數(shù)相加的結(jié)果.因?yàn)檫@個(gè)兩數(shù)可以是浮點(diǎn)數(shù),整數(shù)等.若我們想要準(zhǔn)確的表示兩個(gè)數(shù)據(jù)相加.就得定義若干個(gè)異名函數(shù).
int addi(int a,int b)
{
return a+b;
}
double addd(double a,double b)
{
return a+b;
}
例如這里定義了addi表示兩個(gè)整數(shù)相加,又定義了addd表示兩個(gè)浮點(diǎn)數(shù)相加.
那如果我是寫(xiě)庫(kù)的作者,我需要讓一個(gè)僅需要相加功能的調(diào)用者去了解這么多函數(shù)的名字,僅用來(lái)區(qū)分他們相加的數(shù)據(jù)類(lèi)型嘛?
這樣的工作效率顯然是非常低的,所以C++改進(jìn)了他的方法.
int add(int a,int b)
{
return a+b;
}
double add(double a,double b)
{
return a+b;
}
這兩個(gè)同名函數(shù),因?yàn)閰?shù)類(lèi)型的不同,所以在C++中可以同時(shí)存在.?
這就是函數(shù)重載的概念.
區(qū)分兩個(gè)函數(shù)是否相同不再僅通過(guò)名字,而是通過(guò)參數(shù)個(gè)數(shù)/類(lèi)型/類(lèi)型順序來(lái)區(qū)分.
返回值不同不作為區(qū)分函數(shù)重載的規(guī)則,因?yàn)槟阏{(diào)用該函數(shù)的時(shí)候可以不適用返回值。
void add(int a,double b); 類(lèi)型順序
void add(double a,int b); 類(lèi)型順序 參數(shù)個(gè)數(shù)
void add(double a,int b,int c); 參數(shù)個(gè)數(shù)
?為什么能進(jìn)行區(qū)分呢?
因?yàn)樵贑++中,在編譯階段,會(huì)這樣對(duì)函數(shù)進(jìn)行命名.
第一個(gè)函數(shù)被命名為:addid 表示參數(shù)類(lèi)型為int 與 double
第二個(gè)函數(shù)被命名為:adddi 表示參數(shù)類(lèi)型為double 與 int
第三個(gè)函數(shù)被命名為: adddii 表示參數(shù)類(lèi)型為double、int、int?
使用重載函數(shù)并不會(huì)導(dǎo)致程序運(yùn)行變慢,因?yàn)楦淖兠值氖率窃诰幾g階段就完成了,程序運(yùn)行階段直接去尋找對(duì)應(yīng)的函數(shù).所以并不需要有這種擔(dān)心.
3.引用:
先來(lái)看看我們最開(kāi)始學(xué)編程的時(shí)候?qū)W習(xí)的代碼
int a=0;
int b=a;
這段代碼很簡(jiǎn)單,但他在內(nèi)存里做的事相信很多uu們并不知道.我們現(xiàn)在來(lái)看看
這段代碼是將a指向的數(shù)據(jù)又拷貝了一份放在b中,也就是a、b變成了兩個(gè)獨(dú)立的個(gè)體.他們的共同點(diǎn)也就是值相同.
我們可以打印他的地址來(lái)看看
?int a=0;
?int b=a;
?printf("a:%p \nb:%p",&a,&b);
?
結(jié)果如圖所示,說(shuō)明我們說(shuō)的是對(duì)的.
那我們?cè)賮?lái)看看C++新加入的引用特點(diǎn).
?int a=0;
?int &b=a;
?printf("a:%p \nb:%p",&a,&b);
僅在b前面加上一個(gè)&(注意!!!加在a前表示取地址)
再打印地址,看看會(huì)發(fā)生什么.
?他們的內(nèi)存地址相同了!也就是現(xiàn)在的內(nèi)存模型應(yīng)該長(zhǎng)這樣
?a b都表示這塊內(nèi)存地址的一個(gè)別名.除了名字不同,其他都是相同的.也就是改變a也會(huì)改變b
這段代碼同樣的非常簡(jiǎn)單,但是這樣寫(xiě)是錯(cuò)的,因?yàn)?strong>形參的改變不影響實(shí)參,我們僅需這樣改動(dòng)?
void swap(int a,int b)
{
int tmp=a;
a=b;
b=tmp;
}
int main()
{
int a=2;
int b=3;
swap(a,b);
cout<<"a:"<<" "<<a<<endl;
cout<<"b: "<<b<<endl;
}
??
?在函數(shù)調(diào)用參數(shù)前加上&,表示對(duì)實(shí)參的引用,這樣他們使用的是同一塊內(nèi)存空間.也就可以直接改變了
void swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
int main()
{
int a=2;
int b=3;
swap(a,b);
}
?
?
完結(jié)撒花:
??本篇博客的內(nèi)容【原來(lái)比C方便這么多 --缺省參數(shù)、函數(shù)重載、引用講解】已經(jīng)結(jié)束。
??若對(duì)你有些許幫助,可以點(diǎn)贊、關(guān)注、評(píng)論支持下博主,你的支持將是我前進(jìn)路上最大的動(dòng)力。
??若以上內(nèi)容有任何問(wèn)題,歡迎在評(píng)論區(qū)指出。若對(duì)以上內(nèi)容有任何不解,都可私信評(píng)論詢問(wèn)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-435465.html
??諸君,山頂見(jiàn)!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-435465.html
到了這里,關(guān)于【C++技能樹(shù)】原來(lái)比C方便這么多 --缺省參數(shù)、函數(shù)重載、引用講解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!