網(wǎng)站公司文化怎么做成長電影在線觀看免費(fèi)
C++入門基礎(chǔ)(2)
- 1.缺省函數(shù)
- 2.函數(shù)重載
- 3.引用
- 3.1 引用的概念和定義
- 3.2 引用的特性
- 3.3 引用的使用
- 3.3.1引用的特性
- 4 .const引用
- 5. 指針和引用的關(guān)系
- 6.inline
1.缺省函數(shù)
? 缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定?個(gè)缺省值。在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)參則采?該形參的缺省值,否則使用指定的實(shí)參,缺省參數(shù)分為全缺省和半缺省參數(shù)。(有些地方把缺省參數(shù)也叫默認(rèn)參數(shù))
? 全缺省就是全部形參給缺省值,半缺省就是部分形參給缺省值。C++規(guī)定半缺省參數(shù)必須從右往左依次連續(xù)缺省,不能間隔跳躍給缺省值。
? 帶缺省參數(shù)的函數(shù)調(diào)用,C++規(guī)定必須從左到右依次給實(shí)參,不能跳躍給實(shí)參。
? 函數(shù)聲明和定義分離時(shí),缺省參數(shù)不能在函數(shù)聲明和定義中同時(shí)出現(xiàn),規(guī)定必須函數(shù)聲明給缺省值。
2.函數(shù)重載
C++支持在同?作用域中出現(xiàn)同名函數(shù),但是要求這些同名函數(shù)的形參不同,可以是參數(shù)個(gè)數(shù)不同或者類型不同。這樣C++函數(shù)調(diào)?就表現(xiàn)出了多態(tài)行為,使?更靈活。C語言是不支持同?作用域中出現(xiàn)同名函數(shù)的。
#include<iostream>
using namespace std;
// 1、參數(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;
}
// 2、參數(shù)個(gè)數(shù)不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
// 3、參數(shù)類型順序不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}
// 返回值不同不能作為重載條件,因?yàn)檎{(diào)?時(shí)也?法區(qū)分
//void fxx()
//{}
//
//int fxx()
//{
// return 0;
//}
// 下?兩個(gè)函數(shù)構(gòu)成重載
// f()但是調(diào)?時(shí),會(huì)報(bào)錯(cuò),存在歧義,編譯器不知道調(diào)?誰
void f1()
{cout << "f()" << endl;
}
void f1(int a = 10)
{cout << "f(int a)" << endl;
}
int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, 'a');f('a', 10);return 0;
}
3.引用
3.1 引用的概念和定義
引用不是新定義?個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開辟內(nèi)存空間,它和它引用的變量共用同?塊內(nèi)存空間。比如:水壺傳中李逵,宋江叫"鐵牛",江湖上人稱"?旋風(fēng)";林沖,外號(hào)豹子頭。
但這里要注意的是引用的符號(hào)和取地址的符號(hào)&一樣。
3.2 引用的特性
- 引用在定義時(shí)必須初始化
- 引用在定義時(shí)必須初始化
- 引用一旦引用?個(gè)實(shí)體,再不能引用其他實(shí)體
3.3 引用的使用
3.3.1引用的特性
- 語法簡潔性
引用傳參:使用&符號(hào)聲明引用,語法簡潔直觀。在函數(shù)調(diào)用時(shí),不需要額外的解引用操作,直接使用變量名即可。
指針傳參:需要使用符號(hào)聲明指針,并在函數(shù)體內(nèi)通過解引用來訪問指針指向的值。這種額外的操作增加了代碼的復(fù)雜性。
2.== 安全性==
引用傳參:一旦引用被初始化,它就始終指向同一個(gè)對(duì)象,且不能為空。這避免了空指針異常的風(fēng)險(xiǎn),增加了程序的安全性。
指針傳參:指針可以為空,且可以在函數(shù)中被重新賦值指向其他對(duì)象。因此,在使用指針時(shí)需要更加小心,以避免空指針異常和野指針問題。 - 使用方便性
引用傳參:在函數(shù)定義和調(diào)用時(shí),直接使用變量名即可,無需考慮指針的解引用和空指針檢查等問題。這使得代碼更加易讀和易維護(hù)。
指針傳參:在函數(shù)內(nèi)部,如果需要修改指針指向的值,還需要使用解引用操作符*。此外,如果函數(shù)需要返回指針,還需要考慮指針的生命周期和內(nèi)存管理問題,這增加了代碼的復(fù)雜性。 - 語義明確性
引用傳參:通過引用傳遞參數(shù),可以清晰地表達(dá)函數(shù)將直接修改傳入?yún)?shù)的值,而不是其副本。這種語義上的明確性有助于提高代碼的可讀性和可維護(hù)性。
指針傳參:雖然指針也可以實(shí)現(xiàn)相同的功能,但其語義上可能不夠直觀。特別是在復(fù)雜的代碼結(jié)構(gòu)中,指針的使用可能會(huì)讓其他開發(fā)者難以理解函數(shù)的意圖。
4 .const引用
- 可以引用?個(gè)const對(duì)象,但是必須?const引用。const引?也可以引用普通對(duì)象,因?yàn)?strong>對(duì)象的訪問權(quán)限在引用過程中可以縮小,但是不能放大 。
- C++規(guī)定了臨時(shí)變量是具有常性的,所以這里也要用const去修飾。
- 所謂臨時(shí)對(duì)象就是編譯器需要?個(gè)空間暫存表達(dá)式的求值結(jié)果時(shí)臨時(shí)創(chuàng)建的?個(gè)未命名的對(duì)象,C++中把這個(gè)未命名對(duì)象叫做臨時(shí)對(duì)象。
這里通過使用 const 引用,你告訴編譯器這個(gè)引用不會(huì)修改它所引用的對(duì)象。這使得編譯器能夠放寬類型匹配的要求,因?yàn)榧词惯M(jìn)行了類型轉(zhuǎn)換(從 double 到 int),由于 const 保證了不會(huì)通過引用修改值,所以這種轉(zhuǎn)換是安全的。編譯器會(huì)隱式地將 double 類型的值轉(zhuǎn)換為 int 類型的值(通過截?cái)嘈?shù)部分),并將這個(gè)轉(zhuǎn)換后的值“視為”一個(gè) const int 類型的臨時(shí)對(duì)象,然后讓 const int& l 引用這個(gè)臨時(shí)對(duì)象。
5. 指針和引用的關(guān)系
????指針和引用既有重疊的部分,也有不一樣的地方,他們各有自己的特色,都不能互相替代。
- 語法概念上引用是?個(gè)變量的取別名不開空間,指針是存儲(chǔ)?個(gè)變量地址,要開空間。
- 引用在定義時(shí)必須初始化,指針建議初始化,但是語法上不是必須的。
- 引?在初始化時(shí)引??個(gè)對(duì)象后,就不能再引?其他對(duì)象;而指針可以在不斷地改變指向?qū)ο蟆?/strong>
- 引?可以直接訪問指向?qū)ο?#xff0c;指針需要解引用才是訪問指向?qū)ο蟆?br /> -sizeof中含義不同,引?結(jié)果為引?類型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)(32位平臺(tái)下占4個(gè)字節(jié),64位下是8byte)
- 指針很容易出現(xiàn)空指針和野指針的問題,引用很少出現(xiàn),引用使用起來相對(duì)更安全?些。
6.inline
?inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時(shí)C++編譯器會(huì)在調(diào)?的地?展開內(nèi)聯(lián)函數(shù),這樣調(diào)?內(nèi)聯(lián)函數(shù)就需要建?棧幀了,就可以提?效率。
? inline對(duì)于編譯器??只是?個(gè)建議,也就是說,你加了inline編譯器也可以選擇在調(diào)?的地?不展開,不同編譯器關(guān)于inline什么情況展開各不相同,因?yàn)镃++標(biāo)準(zhǔn)沒有規(guī)定這個(gè)。inline適?于頻繁調(diào)?的短?函數(shù),對(duì)于遞歸函數(shù),代碼相對(duì)多?些的函數(shù),加上inline也會(huì)被編譯器忽略。
? C語?實(shí)現(xiàn)宏函數(shù)也會(huì)在預(yù)處理時(shí)替換展開,但是宏函數(shù)實(shí)現(xiàn)很復(fù)雜很容易出錯(cuò)的,且不?便調(diào)試,C++設(shè)計(jì)了inline?的就是替代C的宏函數(shù)。
? vs編譯器debug版本下?默認(rèn)是不展開inline的,這樣?便調(diào)試,debug版本想展開需要設(shè)置?下以下兩個(gè)地?。
? inline不建議聲明和定義分離到兩個(gè)?件,分離會(huì)導(dǎo)致鏈接錯(cuò)誤。因?yàn)閕nline被展開,就沒有函數(shù)地址,鏈接時(shí)會(huì)出現(xiàn)報(bào)錯(cuò)。