cout<
return 0;
}
std命名空間的使用慣例
std是C++標(biāo)準(zhǔn)庫的命名空間,如何展開std使用更合理呢?
在日常練習(xí)中,建議直接using namespace std即可,這樣就很方便。using namespace std展開,標(biāo)準(zhǔn)庫就全部暴露出來了,如果我們定義跟庫重名的類型/對象/函數(shù),就存在沖突問題。該問題在日常練習(xí)中很少出現(xiàn),但是項(xiàng)目開發(fā)中代碼較多、規(guī)模大,就很容易出現(xiàn)。所以建議在項(xiàng)目開發(fā)中使用,像std::cout這樣使用時(shí)指定命名空間 + using std::cout展開常用的庫對象/類型等方式。
缺省參數(shù)
缺省參數(shù)是函數(shù)定義時(shí)的一個特性,它允許在函數(shù)的聲明或定義中為某些參數(shù)指定默認(rèn)值。如果沒有為這些參數(shù)傳遞實(shí)參,函數(shù)就會使用這些默認(rèn)值;如果傳遞了實(shí)參,則使用傳遞的值。
缺省參數(shù)的定義
當(dāng)你定義或聲明一個函數(shù)時(shí),你可以為參數(shù)指定一個默認(rèn)值,如下所示:
void Print(int number = 0) {
cout << number;
}
在這個例子中,函數(shù)Print有一個參數(shù)number,它的默認(rèn)值是0。這意味著如果你調(diào)用Print()而沒有任何實(shí)參,函數(shù)將使用默認(rèn)值0。
缺省參數(shù)的使用
調(diào)用函數(shù)時(shí)不傳遞參數(shù)
如果你在調(diào)用Print函數(shù)時(shí)不提供任何參數(shù),它將使用參數(shù)的默認(rèn)值:
Print(); // 輸出: 0
調(diào)用函數(shù)時(shí)傳遞參數(shù)
如果你提供了參數(shù),函數(shù)將使用你傳遞的值而不是默認(rèn)值:
Print(5); // 輸出: 5
缺省參數(shù)的規(guī)則
默認(rèn)值的位置:在函數(shù)原型或定義中,默認(rèn)值必須位于參數(shù)列表的末尾。也就是說,你必須從右向左指定參數(shù)的默認(rèn)值。 全缺省參數(shù):所有參數(shù)都可以有默認(rèn)值,這種函數(shù)調(diào)用時(shí)可以不提供任何實(shí)參。 半缺省參數(shù):只有部分參數(shù)有默認(rèn)值。當(dāng)你指定了某個參數(shù)的默認(rèn)值時(shí),所有位于其右側(cè)的參數(shù)也必須有默認(rèn)值。 默認(rèn)參數(shù)的順序:你不能為一個參數(shù)指定默認(rèn)值,然后跳過前面的參數(shù)為后面的參數(shù)指定默認(rèn)值。必須從右至左連續(xù)指定。
示例
下面是一個包含半缺省參數(shù)的函數(shù)示例:
void Print(int number, int count = 1) {
for (int i = 0; i < count; i++) {
cout << number << " ";
}
cout << endl;
}
Print(5); // 輸出: 5 (使用了number的默認(rèn)值,count的默認(rèn)值)
Print(5, 3); // 輸出: 5 5 5 (使用了傳遞的number值和count值)
在這個例子中,Print函數(shù)的第一個參數(shù)number沒有默認(rèn)值,第二個參數(shù)count有默認(rèn)值1。所以,如果你只提供一個參數(shù),那么第二個參數(shù)將使用默認(rèn)值1。
函數(shù)重載
函數(shù)重載是一種允許多個同名函數(shù)在相同的作用域中存在,只要它們的參數(shù)列表不同(即參數(shù)的個數(shù)、類型或順序不同)的特性。函數(shù)重載使得程序設(shè)計(jì)更加靈活,能夠根據(jù)不同的參數(shù)執(zhí)行相似或相關(guān)的任務(wù)。
函數(shù)重載的概念
當(dāng)你在同一作用域內(nèi)定義多個同名函數(shù)時(shí),這些函數(shù)如果參數(shù)列表不同,它們就是重載的。重載的函數(shù)可以具有不同的參數(shù)數(shù)量、不同的參數(shù)類型,或者參數(shù)類型順序不同。然而,函數(shù)重載與函數(shù)返回類型無關(guān),即不能僅通過返回類型來重載函數(shù)。
函數(shù)重載的規(guī)則
參數(shù)列表必須不同:重載的函數(shù)必須有區(qū)別于其他同名函數(shù)的參數(shù)列表。 返回類型不影響重載:即使函數(shù)的返回類型不同,也不構(gòu)成有效的重載。 作用域的限制:函數(shù)重載只限于同一作用域內(nèi)。在不同的作用域(如不同的命名空間或類中),即使是完全相同的函數(shù)名和參數(shù)列表,也被視為不同的函數(shù)。
函數(shù)重載的示例
以下是一個展示函數(shù)重載的簡單示例:
#include
using namespace std;
// 重載函數(shù):接受一個整數(shù)參數(shù)
void display(int number) {
cout << "Displaying int: " << number << endl;
}
// 重載函數(shù):接受浮點(diǎn)參數(shù)
void display(float number) {
cout << "Displaying float: " << number << endl;
}
// 重載函數(shù):接受兩個整數(shù)參數(shù)
void display(int number1, int number2) {
cout << "Displaying two int: " << number1 << " and " << number2 << endl;
}
int main() {
display(12); // 調(diào)用第一個重載版本的display函數(shù)
display(12.3f); // 調(diào)用第二個重載版本的display函數(shù)
display(12, 24); // 調(diào)用第三個重載版本的display函數(shù)
return 0;
}
在這個例子中,我們定義了三個display函數(shù)。第一個接受一個整數(shù)參數(shù),第二個接受一個浮點(diǎn)參數(shù),第三個接受兩個整數(shù)參數(shù)。由于它們的參數(shù)列表不同,這三個函數(shù)是重載的。
函數(shù)重載的工作原理
編譯器通過函數(shù)的名稱修飾(name mangling)來區(qū)分不同的載函數(shù)。它修改函數(shù)的名稱,通常添加額外的信息以反映參數(shù)類型和參數(shù)數(shù)量,從而生成不同的函數(shù)名稱以供鏈接器使用。
函數(shù)重載的注意點(diǎn)
不能通過返回類型來區(qū)分重載函數(shù)。如果新的重載函數(shù)參數(shù)列表是現(xiàn)有函數(shù)參數(shù)列表的超集,這可能導(dǎo)致函數(shù)名稱修飾出現(xiàn)問題,并可能引起函數(shù)調(diào)用的歧義。 -重載函數(shù)時(shí),要注意不要造成函數(shù)名稱的混淆,否則編譯器可能無法正確地選擇調(diào)用哪一個函數(shù)。
引用
當(dāng)然可以。在C++中,引用(reference)是一個非常便利的特性,它允許程序員為變量的別名。通過使用引用,我們可以通過這個別名來直接訪問或修改變量的值。引用在很多情況下可以用來代替指針,因?yàn)樗鼈兲峁┝艘环N更安全和更易于理解的語法。
引用的定義和聲明
引用的聲明與指針類似,但它不需要使用星號*。引用在聲明時(shí)必須被初始化,一旦初始化之后,它就不能再綁定到另一個變量上。
類型 &引用名 = 變量名;
例如:
int a = 10;
int &ref = a; // 聲明引用ref,并將其初始化為變量a的引用
在這個例子中,ref是a的引用,它們代表同一個存儲位置。
引用的特性
引用是別名:引用實(shí)際上是原變量的別名,任何對引用的操作都直接反映在原變量上。 初始化時(shí)綁定:引用必須在聲明時(shí)綁定到具體的變量,且一旦綁定就不能再改變引用所指向的變量。 沒有獨(dú)立的內(nèi)存地址:引用沒有自己的內(nèi)存地址,它共享原變量的內(nèi)存地址。 無需解引用:使用引用時(shí)不需要像指針那樣進(jìn)行解引用操作,直接使用引用名即可。
引用的使用
傳遞引用到函數(shù)
引用經(jīng)常用于函數(shù)參數(shù),允許函數(shù)直接修改傳入的參數(shù)值,而不是參數(shù)的副本:
void addOne(int &num) {
num = num + 1; // 直接修改傳入的參數(shù)
}
int main() {
int x = 5;
addOne(x); // x的值將變?yōu)?
return 0;
}
在這個例子中,addOne函數(shù)接受一個整數(shù)的引用作為參數(shù),所以它可以直接修改x的值。
返回引用
函數(shù)也可以返回引用,這樣返回的是變量的引用而不是副本:
int &getFirstElement(int arr[]) {
return arr[0]; // 返回第一個元素的引用
}
int main() {
int myArray[] = {10, 20, 30};
int &first = getFirstElement(myArray); // first是myArray[0]的引用
first = 100; // 直接修改myArray[0]的值
return 0;
}
在這個例子中,getFirstElement函數(shù)返回?cái)?shù)組第一個元素的引用,因此通過first可以直接修改myArray[0]的值。
引用的注意事項(xiàng)
不能有null引用:指針可以被賦予nullptr,但引用必須指向一個有效的變量。不能重新綁定:一旦引用被初始化為一個變量,它就不能再指向另一個變量。引用不能指向數(shù)組:你不能創(chuàng)建一個數(shù)組的引用,但可以創(chuàng)建指向數(shù)組元素的引用。
引用和指針的不同點(diǎn):
引用概念上定義一個變量的別名,指針存儲一個變量地址。引用在定義時(shí)必須初始化,指針沒有要求引用在初始化時(shí)引用一個實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何 一個同類型實(shí)體沒有NULL引用,但有NULL指針在sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個數(shù)(32 位平臺下占4個字節(jié))引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個類型的大小有多級指針,但是沒有多級引用訪問實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理引用比指針使用起來相對更安全
內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)是一種優(yōu)化手段,其目的是減少函數(shù)調(diào)用的開銷。當(dāng)函數(shù)體較小且被頻繁調(diào)用時(shí),函數(shù)調(diào)用的成本可能會對性能產(chǎn)生負(fù)面影響。為了減少這種開銷,可以將函數(shù)聲明為內(nèi)聯(lián)函數(shù),使得每次函數(shù)調(diào)用時(shí),編譯器將函數(shù)的代碼直接插入到調(diào)用點(diǎn),而不是通過跳轉(zhuǎn)到函數(shù)代碼的地址去執(zhí)行。
內(nèi)聯(lián)函數(shù)的定義
內(nèi)聯(lián)函數(shù)通過在函數(shù)聲明或定義之前添加inline關(guān)鍵字來指定。例如:
inline int add(int a, int b) {
return a + b;
}
內(nèi)聯(lián)函數(shù)的特點(diǎn)
減少調(diào)用開銷:由于函數(shù)體直接插入到調(diào)用點(diǎn),省去了函數(shù)調(diào)用的參數(shù)傳遞、返回值處理以及堆棧操作等開銷。 無額外內(nèi)存分配:內(nèi)聯(lián)函數(shù)不會像普通函數(shù)那樣在棧上為局部變量分配內(nèi)存。 編譯器優(yōu)化:編譯器可能會對內(nèi)聯(lián)函數(shù)的代碼進(jìn)行額外的優(yōu)化。
內(nèi)聯(lián)函數(shù)的使用
內(nèi)聯(lián)函數(shù)通常用于以下場景:
小型函數(shù):函數(shù)體非常短小,例如簡單的算術(shù)運(yùn)算或訪問器函數(shù)。 頻繁調(diào)用的函數(shù):如果一個函數(shù)在程序中頻繁調(diào)用,那么將其聲明為內(nèi)聯(lián)可能會提升性能。 性能關(guān)鍵代碼:在性能敏感的代碼路徑中,使用內(nèi)聯(lián)函數(shù)可以減少函數(shù)調(diào)用開銷。
內(nèi)聯(lián)函數(shù)的注意事項(xiàng)
編譯器選擇:即使函數(shù)被聲明為內(nèi)聯(lián),編譯器也有權(quán)決定是否真正內(nèi)聯(lián)該函數(shù)。這取決于編譯器的優(yōu)化策略和函數(shù)的復(fù)雜性。 過度內(nèi)聯(lián):如果過度使用內(nèi)聯(lián)函數(shù),可能會導(dǎo)致代碼膨脹,增加程序的內(nèi)存占用,并且可能影響緩存效率。 遞歸函數(shù):內(nèi)聯(lián)遞歸函數(shù)可能會導(dǎo)致代碼無限增長,因此通常不推薦對遞歸函數(shù)使用內(nèi)聯(lián)。 調(diào)試?yán)щy:內(nèi)聯(lián)函數(shù)可能會使得調(diào)試變得復(fù)雜,因?yàn)楹瘮?shù)調(diào)用點(diǎn)沒有明顯的調(diào)用棧幀。
內(nèi)聯(lián)函數(shù)與宏的區(qū)別
雖然內(nèi)聯(lián)函數(shù)和宏都可以在編譯時(shí)插入代碼,但它們有一些重要區(qū)別:
類型安全:內(nèi)聯(lián)函數(shù)是類型安全的,而宏不是。宏只是簡單的文本替換,可能會導(dǎo)致類型安全問題。 作用域:內(nèi)聯(lián)函數(shù)可以訪問局部變量和全局變量,而宏則不能。 調(diào)試:內(nèi)聯(lián)函數(shù)可以像普通函數(shù)一樣調(diào)試,宏則不能。 參數(shù)的副作用:宏在展開時(shí)可能會對參數(shù)產(chǎn)生副作用,而內(nèi)聯(lián)函數(shù)則不會。
柚子快報(bào)邀請碼778899分享:C++基礎(chǔ)
http://yzkb.51969.com/
精彩內(nèi)容