C++與C區(qū)別概述C++ 是在 C 語言的基礎(chǔ)上發(fā)展而來的一門編程語言,,它在語法,、數(shù)據(jù)類型、函數(shù),、運算符等方面都比 C 語言更為豐富和靈活,,同時也具有更好的支持面向?qū)ο缶幊蹋∣OP)的能力,因此被廣泛應(yīng)用于各種系統(tǒng)和應(yīng)用程序的開發(fā)中,。以下是 C++ 與 C 語言的一些主要區(qū)別:
以上只是 C 和 C++ 之間的一些簡單區(qū)別,實際上它們在很多方面有著類似的語法和特性,。對于學(xué)習(xí)者來說,,如果已經(jīng)掌握了 C 語言,那么學(xué)習(xí) C++ 就會比較容易,,因為 C++ 的語法和特性可以看作是 C 語言的擴展和補充。接下來我們詳細了解一些基礎(chǔ)階段必須要掌握的C++與C的區(qū)別,。 C++與C的區(qū)別詳解文件區(qū)別C 和 C++ 的文件有以下幾點不同:
命名空間在 C++ 中,,命名空間是用于防止命名沖突的重要機制,可以將全局作用域分為若干個小的作用域,,不同的空間可以分別存放變量,、函數(shù)等名稱相同但含義不同的實體。C++ 中的命名空間是一個重要的語言特性,,可以防止不同作用域內(nèi)同名實體的沖突,。對于大型程序的開發(fā)來說,合理使用命名空間可以提高代碼的可讀性和可維護性,。命名空間主要是掌握以下內(nèi)容
命名空間| 創(chuàng)建 命名空間創(chuàng)建語法如下: 如下測試代碼: #include <iostream>//直接實現(xiàn)namespace MM{ int age; int num; void print() { }}//先聲明后實現(xiàn)namespace Boy { void print(); struct Info ;}struct Boy::Info { int data;};void Boy::print() {}int main() { return 0;} 命名空間| 訪問 命名空間中的數(shù)據(jù)通過空間名和作用域分辨符::完成,,作用域分辨符::還可以表示全局變量。如下測試代碼:
using namespace 語句具有作用域,,從使用處到第一次包含{}結(jié)束,。 命名空間| 嵌套 命名空間嵌套使用剝洋蔥的方式訪問即可。如下測試代碼: #include <iostream>namespace Cool{ int a = 1; namespace Mo { int b = 2; namespace Ying { int c = 3; } }}int main() { Cool::a=11; Cool::Mo::b = 22; Cool::Mo::Ying::c = 33; { using namespace Cool; a = 111; Mo::b = 222; Mo::Ying::c = 333; using namespace Mo; b = 2222; Ying::c = 3333; using namespace Ying; c = 33333; } { using namespace Cool::Mo::Ying; c = 444; } return 0;} 命名空間| C++內(nèi)置空間名std 在 C++ 中,,std 是一個常用的內(nèi)置命名空間,,包含了大量的常用庫函數(shù)和數(shù)據(jù)類型,例如 std::cout,、std::string,、std::vector 等。這些函數(shù)和數(shù)據(jù)類型都位于 std 命名空間中,,使用時需要通過 std:: 前綴進行引用,。或者在寫C++程序的時候,,在頭文件下面 直接使用:using namespace std; 有意思的是采用無后綴的包含C語言頭文件后,,C語言所有函數(shù)也可以采用std::使用。 如下測試代碼:
C++標(biāo)準(zhǔn)輸入輸出在 C++ 中,,標(biāo)準(zhǔn)輸入輸出通常使用 std::cin 和 std::cout 實現(xiàn),。這些對象是 C++ 標(biāo)準(zhǔn)庫 <iostream> 中的對象,用于在標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出流之間進行輸入輸出數(shù)據(jù)交互。目前學(xué)會如何使用即可,無需追究那么多為什么,IO流操作中會介紹成員函數(shù)的使用方式,,以及其他IO對象,。 標(biāo)準(zhǔn)輸入輸出| 輸出到屏幕 基本輸出:cout加上 << 完成,需要掌握以下內(nèi)容
如下測試代碼: #include <iostream>int main() { //C++也支持轉(zhuǎn)義字符 std::cout << '字符串\n'; std::cout << 1; std::cout << 1.1f; std::cout << 1.1; std::cout << '\n'; std::cout << '字符串\n' << 1 << '\n' << 1.1 << '\n'; int a = 1; float b = 1.1f; char name[20] = { '張三' }; //輸出多個數(shù)據(jù),無需格式控制字符 std::cout << a << '\t' << b << '\t' << name << '\n'; std::cout << 'C++換行' << std::endl; //一般寫在頭文件下面 using namespace std; cout << '使用了using namespace std,無需std前綴' << endl; return 0;} 標(biāo)準(zhǔn)輸入輸出| 從鍵盤輸入 基本輸入: cin加上 >>完成,通常不需要任何格式控制字符,,如下測試代碼:
C++新的基礎(chǔ)類型C++新基礎(chǔ)類型|nullptr_t類型 nullptr_t 是 C++11 中引入的一個新的關(guān)鍵字,,用于表示一個空指針常量的類型,是一種特殊的數(shù)據(jù)類型,。當(dāng)需要傳遞一個空指針常量給一個函數(shù)或作為一個函數(shù)返回值時,,就可以使用 nullptr_t 來明確聲明空指針常量的類型。C++空指針引入nullptr替換C語言中NULL,,可以方便地編寫出更加清晰,、簡潔和易于閱讀的代碼,避免出現(xiàn)空指針引用的錯誤,,提高程序的可讀性和安全性,。如下測試代碼: #include <iostream>void func(std::nullptr_t ptr) { std::cout << 'coolmoying' << std::endl;}int main() { func(nullptr); //使用nullptr替換NULL int* p = nullptr; return 0;} C++新基礎(chǔ)類型|bool類型 在 C++ 中,bool 類型表示布爾值,,僅包含兩個值:true 和 false,。bool 類型是 C++ 的基本數(shù)據(jù)類型之一,用于存儲布爾值,。C++ 的布爾類型提供了 bool 關(guān)鍵字來定義變量,,bool 類型的變量可以作為條件表達式傳遞給 if 語句、while 循環(huán)等語句中,,需要注意的是,,C++ 中的 true 和 false 是關(guān)鍵字,不是任何標(biāo)識符的名稱,。bool 類型賦值給其他類型時,,false 轉(zhuǎn)換為整型值 0,true 轉(zhuǎn)換為整型值 1,。其他類型的值賦值給 bool 時,,非零值為 true,零值為 false,。 如下測試代碼:
程序運行結(jié)果如下: C++新基礎(chǔ)類型|不一樣const類型 C++const比C語言const的要求更嚴(yán)格,。當(dāng)然const類型變量不能被修改并且創(chuàng)建的時候必須做初始化,這些依舊和C語言一樣,,主要區(qū)別在于字符串操作上,。如下測試代碼: #include <iostream>void printStr(char* pstr){ std::cout << '只能傳入變量,不能傳入常量' << std::endl;}void printStrConst(const char* pstr){ std::cout << '只能傳入變量,不能傳入常量' << std::endl;}int main(){ //錯誤使用 //char* pstr='coolmoying'; //C++必須const修飾 const char* pstr = 'coolmoying'; //錯誤調(diào)用 //printStr('coolmoying'); //printStr(pstr); char str[] = { 'coolmoying' }; printStr(str); printStrConst(pstr); printStrConst(str); return 0;} C++const比C語言更為強大,C++const可以修飾類中函數(shù) ,具體后續(xù)講解 C++新基礎(chǔ)類型|引用類型 左值引用 在 C++ 中,引用是一種特殊的類型,,用于給一個已經(jīng)存在的變量取一個別名,。引用可以簡單理解為起別名的變量,,一旦引用被定義,它將一直引用同一個變量,。使用引用可以在函數(shù)中方便地傳遞變量,、減少內(nèi)存開銷等?;菊Z法:type &name = variable; 如下測試代碼:
常引用 在 C++ 中,,常量引用是一個指向常量的引用。使用常量引用可以在不復(fù)制變量的情況下訪問常量,,并防止其修改,。常量引用提供了一種方法來以只讀方式引用已經(jīng)存在的常量數(shù)據(jù)。這可以避免對變量的誤修改,,并且在函數(shù)參數(shù)傳遞和函數(shù)返回值中使用常量引用可以減少內(nèi)存開銷。常量引用通常在函數(shù)傳參和函數(shù)返回值中使用,?;菊Z法:const type &name = variable; 如下測試代碼: #include <iostream>void print(const int& num) { std::cout << '傳普通變量或常量' << std::endl;}void printData(int& num){ std::cout << '只傳普通變量' << std::endl;}int main(){ const int num = 10; //錯誤用法 //int& number = num; const int& number = num; //錯誤代碼,常量不可修改 //number = 123; int data = 123; const int& xData = data; //const修飾的引用,,不能修改 //xData = 123; //函數(shù)傳參即可傳入常量和變量 print(1); print(number); print(data); //只可傳入常量 printData(data); //錯誤調(diào)用 //printData(number); //printData(1); return 0;} 右值引用 在 C++ 中,,右值引用是 C++11 新增的特性,屬于引用類型,。與左值引用不同,,右值引用是一個指向臨時對象(右值)的引用。右值是指無法被賦值或訪問地址的臨時對象,,右值引用可以為這些臨時對象提供一個有效的引用,,從而允許使用更有效的 C++ 編程技術(shù)來處理它們?;菊Z法:type &&name = variable; 如下測試代碼:
std::move函數(shù) 在 C++11 中,,std::move 是一個重載函數(shù),用來支持右值引用語法的實現(xiàn),。std::move 接受一個對象,,并將其轉(zhuǎn)換成右值引用類型。通過調(diào)用 std::move 函數(shù),,我們可以顯式地將一個具有名稱的對象轉(zhuǎn)換為右值引用,,并從該對象到達一個新的右值引用對象。這樣做的主要目的是為了可以在不拷貝數(shù)據(jù)的情況下將數(shù)據(jù)傳遞給新的對象,。也就是說,,std::move 可以將一個左值轉(zhuǎn)換為右值,讓程序能夠更加高效地利用資源,。在開發(fā)中,,std::move 主要用于資源管理,、移動語義和環(huán)境的構(gòu)建。如下測試代碼: #include <iostream>void print(int&& right) {}int main(){ int&& rigthvalue = 123; int age = 0; //錯誤調(diào)用 //print(age); print(std::move(age)); print(123); return 0;} 引用折疊 在 C++11 引入的右值引用的特性中,,引用折疊是一個非常重要的概念,。引用折疊指的是在特定情況下,通過遵守一些簡單的規(guī)則,,可以使用兩個引用聲明名稱新的別名,,并將其和現(xiàn)有的引用類型組合成一個新類型。引用折疊規(guī)則如下:
引用折疊的一個重要的應(yīng)用場景是在使用模板時,,可以統(tǒng)一地處理左值引用和右值引用,。如下測試代碼:
引用折疊的規(guī)則在 C++ 模板編程中特別有用,因為我們可以將一個泛型實參視為一個“引用”,,從而同時處理左值和右值引用,。例如,在泛型算法 std::move() 中使用了引用折疊的技巧,,可以將一個任意類型對象轉(zhuǎn)換為右值引用,,以便能夠使用右值語義來操作對象。目前簡單了解一下,。 C++新基礎(chǔ)類型|自動推斷類型 在 C++11 中,,引入了自動類型推斷(type inference)的特性,該特性允許編譯器在某些情況下自動推斷變量的類型,,從而避免了使用顯式類型聲明和指定的麻煩和冗長,。這可以讓我們更加方便快捷地定義變量和編寫代碼。C++ 中實現(xiàn)自動類型推斷主要有兩種語法:
在使用自動類型推斷時,需要注意以下幾點:
總之,,自動類型推斷是 C++11 中一個重要的特性,,它可以讓我們更方便地定義變量,避免了繁瑣的類型聲明,,同時也可以提高代碼的可讀性和效率,,并減少代碼中的出錯率。但是,,在使用自動類型推斷時,,我們也需要遵循一些規(guī)則,保證代碼的正確性和可讀性,。如下測試代碼: #include <iostream>struct MM { int age; char name[20];};int main(){ int num = 111; auto p1 = # decltype(&num) p2 = # MM mm = { 18,'baby' }; auto pMM = &mm; //錯誤用法 // auto必須通過初始來推斷 //auto pstr; return 0;} C++函數(shù)思想C++函數(shù)思想|函數(shù)內(nèi)聯(lián) 在 C++ 編程中,,函數(shù)內(nèi)聯(lián)是一種編譯器對于函數(shù)的特殊處理方式。函數(shù)內(nèi)聯(lián)可以在編譯期間將函數(shù)的定義嵌入到函數(shù)調(diào)用點處,,從而消除了函數(shù)調(diào)用的開銷,,提高了程序的運行效率。使用函數(shù)內(nèi)聯(lián)的主要好處是可以減少函數(shù)調(diào)用帶來的開銷,,避免函數(shù)調(diào)用堆棧的推入和彈出,這對于一些短小精悍的函數(shù)特別有效,。 C++ 中使用 inline 關(guān)鍵字來指定一個函數(shù)為內(nèi)聯(lián)函數(shù),。一般情況下,將函數(shù)定義與函數(shù)聲明放在頭文件中并使用 inline 關(guān)鍵字來修飾,,可以讓編譯器自動對該函數(shù)進行內(nèi)聯(lián)優(yōu)化,。需要注意的是,在進行內(nèi)聯(lián)優(yōu)化時,,并不是所有的函數(shù)都適合進行內(nèi)聯(lián),。如果一個函數(shù)的計算量比較大,或者參數(shù)較多,,內(nèi)聯(lián)將會使代碼量變大,、可維護性降低、編譯器時間增加,,反而會導(dǎo)致程序效率降低,。在進行函數(shù)內(nèi)聯(lián)時,我們需要根據(jù)具體情況進行判斷,,謹(jǐn)慎地選擇需要進行內(nèi)聯(lián)優(yōu)化的函數(shù),。如下測試代碼:
C++函數(shù)思想|函數(shù)重載 在 C++ 中,函數(shù)重載(Function Overloading)是一種允許在同一作用域內(nèi)聲明多個具有相同名稱但參數(shù)不同的函數(shù)的機制,。通過函數(shù)重載,,我們可以用一個函數(shù)名稱實現(xiàn)多種不同的功能,,這使得代碼更加靈活和易于維護。 函數(shù)重載的規(guī)則和注意事項如下:
如下測試代碼: #include <iostream>//數(shù)目不同void print(int a) { std::cout << 'int' << std::endl;}void print(int a, int b) { std::cout << 'int,int' << std::endl;}//類型不同void print(char a,int b){ std::cout << 'char,int' << std::endl;}//順序不同void print(int a, char b) { std::cout << 'int,char' << std::endl;}int main(){ print(1); print(1, 2); print('A', 1); print(1, 'A'); return 0;} 函數(shù)重載是一個非常有用的特性,可以優(yōu)化代碼的可讀性和效率,。通過函數(shù)重載,,我們可以使用同一函數(shù)名實現(xiàn)不同功能的函數(shù),而無需使用不同的函數(shù)名稱,。在實際編程中,,我們可以根據(jù)具體情況選擇是否使用函數(shù)重載來強化代碼的可重用性和擴展性。 C++函數(shù)思想|函數(shù)缺省 在 C++ 中,,函數(shù)參數(shù)的缺?。―efault Arguments)是一種在函數(shù)參數(shù)列表中為參數(shù)提供默認(rèn)值的機制。當(dāng)調(diào)用帶有缺省參數(shù)的函數(shù)時,,如果沒有為該參數(shù)傳遞值,,則該參數(shù)將采用默認(rèn)值。缺省必須從右往左缺省,。通過使用函數(shù)缺省,,我們可以簡化函數(shù)接口,避免代碼的冗余以及提高代碼的靈活性,。測試代碼如下:
函數(shù)缺省是 C++ 中重要的一個特性,,它可以為參數(shù)列表中的參數(shù)提供默認(rèn)值,使得使用函數(shù)變得更加便捷,、自然和安全,。在實際開發(fā)中,我們可以利用函數(shù)缺省來減少代碼重復(fù),、提高代碼的可維護性以及增強代碼的靈活性,。 相關(guān)如果閣下正好在學(xué)習(xí)C/C++,看文章比較無聊,,不妨關(guān)注下關(guān)注下小編的視頻教程,,通俗易懂,,深入淺出,一個視頻只講一個知識點,。視頻不深奧,,不需要鉆研,在公交,、在地鐵,、在廁所都可以觀看,隨時隨地漲姿勢,。 |
|