C++ 是在 C 語言的基礎(chǔ)上發(fā)展而來的一門編程語言,它在語法、數(shù)據(jù)類型、函數(shù)、運(yùn)算符等方面都比 C 語言更為豐富和靈活,同時也具有更好的支持面向?qū)ο缶幊蹋∣OP)的能力,因此被廣泛應(yīng)用于各種系統(tǒng)和應(yīng)用程序的開發(fā)中。以下是 C++ 與 C 語言的一些主要區(qū)別:
以上只是 C 和 C++ 之間的一些簡單區(qū)別,實(shí)際上它們在很多方面有著類似的語法和特性。對于學(xué)習(xí)者來說,如果已經(jīng)掌握了 C 語言,那么學(xué)習(xí) C++ 就會比較容易,因?yàn)?C++ 的語法和特性可以看作是 C 語言的擴(kuò)展和補(bǔ)充。接下來我們詳細(xì)了解一些基礎(chǔ)階段必須要掌握的C++與C的區(qū)別。
C 和 C++ 的文件有以下幾點(diǎn)不同:
在 C++ 中,命名空間是用于防止命名沖突的重要機(jī)制,可以將全局作用域分為若干個小的作用域,不同的空間可以分別存放變量、函數(shù)等名稱相同但含義不同的實(shí)體。C++ 中的命名空間是一個重要的語言特性,可以防止不同作用域內(nèi)同名實(shí)體的沖突。對于大型程序的開發(fā)來說,合理使用命名空間可以提高代碼的可讀性和可維護(hù)性。命名空間主要是掌握以下內(nèi)容
命名空間| 創(chuàng)建
命名空間創(chuàng)建語法如下:
如下測試代碼:
#include <iostream>//直接實(shí)現(xiàn)namespace MM{ int age; int num; void print() { }}//先聲明后實(shí)現(xiàn)namespace Boy { void print(); struct Info ;}struct Boy::Info { int data;};void Boy::print() {}int main() { return 0;}
命名空間| 訪問
命名空間中的數(shù)據(jù)通過空間名和作用域分辨符::完成,作用域分辨符::還可以表示全局變量。如下測試代碼:
#include <iostream>//直接實(shí)現(xiàn)namespace MM{ int age; int num; void print() { }}int g_num = 99;int main() { int g_num = 88; //默認(rèn)就近原則 int x = g_num; //使用全局 int y = ::g_num; //1.空間名限定訪問 MM::age = 123; MM::print(); //2.省略前綴訪問 //using namespace語句具有作用域 using namespace MM; age = 123; print(); return 0;}
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:: 前綴進(jìn)行引用?;蛘咴趯慍++程序的時候,在頭文件下面 直接使用:using namespace std; 有意思的是采用無后綴的包含C語言頭文件后,C語言所有函數(shù)也可以采用std::使用。
如下測試代碼:
#include <cstdio>int main() { std::puts('coolmoying'); std::printf('coolmoying'); return 0;}
在 C++ 中,標(biāo)準(zhǔn)輸入輸出通常使用 std::cin 和 std::cout 實(shí)現(xiàn)。這些對象是 C++ 標(biāo)準(zhǔn)庫 <iostream> 中的對象,用于在標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出流之間進(jì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加上 >>完成,通常不需要任何格式控制字符,如下測試代碼:
#include <iostream>int main() { int a; float b; char name[20] = { '' }; std::cout << '請輸入三個數(shù)據(jù):'; std::cin >> a; std::cin >> b; std::cin >> name; std::cout << a << '\t' << b << '\t' << name << std::endl; //默認(rèn)用空格或者換行作為數(shù)據(jù)間隔 std::cout << '請輸入三個數(shù)據(jù):'; std::cin >> a >> b >> name; std::cout << a << '\t' << b << '\t' << name << std::endl; return 0;}
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 類型的變量可以作為條件表達(dá)式傳遞給 if 語句、while 循環(huán)等語句中,需要注意的是,C++ 中的 true 和 false 是關(guān)鍵字,不是任何標(biāo)識符的名稱。bool 類型賦值給其他類型時,false 轉(zhuǎn)換為整型值 0,true 轉(zhuǎn)換為整型值 1。其他類型的值賦值給 bool 時,非零值為 true,零值為 false。
如下測試代碼:
#include <iostream>#include <iomanip>int main() { bool close = true; std::cout << 'bool類輸出只有0和1:' << close << std::endl; std::cout << '非零表示成立:' << close << std::endl; std::cout <<std::boolalpha<< '打印true或false:' << close << std::endl; close = -1; return 0;}
程序運(yùn)行結(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語言更為強(qiáng)大,C++const可以修飾類中函數(shù) ,具體后續(xù)講解
C++新基礎(chǔ)類型|引用類型
左值引用
在 C++ 中,引用是一種特殊的類型,用于給一個已經(jīng)存在的變量取一個別名。引用可以簡單理解為起別名的變量,一旦引用被定義,它將一直引用同一個變量。使用引用可以在函數(shù)中方便地傳遞變量、減少內(nèi)存開銷等。基本語法:type &name = variable; 如下測試代碼:
#include <iostream>int main(){ int num = 1; //number就是num,同一段內(nèi)存不同名字 int& number = num; number = 123; std::cout << num << std::endl; std::cout << number << std::endl; return 0;}
常引用
在 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; 如下測試代碼:
#include <iostream>void print(int&& right) {}int main(){ int&& rigthvalue = 123; int age = 0; //錯誤調(diào)用 //print(age); print(123); return 0;}
std::move函數(shù)
在 C++11 中,std::move 是一個重載函數(shù),用來支持右值引用語法的實(shí)現(xiàn)。std::move 接受一個對象,并將其轉(zhuǎn)換成右值引用類型。通過調(diào)用 std::move 函數(shù),我們可以顯式地將一個具有名稱的對象轉(zhuǎn)換為右值引用,并從該對象到達(dá)一個新的右值引用對象。這樣做的主要目的是為了可以在不拷貝數(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)一地處理左值引用和右值引用。如下測試代碼:
#include <iostream>int main(){ typedef int&& Type; int num = 0; //等效 int& a=num; Type& a = num; //等效 int&& b=123; Type&& b = 123; return 0;}
引用折疊的規(guī)則在 C++ 模板編程中特別有用,因?yàn)槲覀兛梢詫⒁粋€泛型實(shí)參視為一個“引用”,從而同時處理左值和右值引用。例如,在泛型算法 std::move() 中使用了引用折疊的技巧,可以將一個任意類型對象轉(zhuǎn)換為右值引用,以便能夠使用右值語義來操作對象。目前簡單了解一下。
C++新基礎(chǔ)類型|自動推斷類型
在 C++11 中,引入了自動類型推斷(type inference)的特性,該特性允許編譯器在某些情況下自動推斷變量的類型,從而避免了使用顯式類型聲明和指定的麻煩和冗長。這可以讓我們更加方便快捷地定義變量和編寫代碼。C++ 中實(shí)現(xiàn)自動類型推斷主要有兩種語法:
在使用自動類型推斷時,需要注意以下幾點(diǎ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ù)思想|函數(shù)內(nèi)聯(lián)
在 C++ 編程中,函數(shù)內(nèi)聯(lián)是一種編譯器對于函數(shù)的特殊處理方式。函數(shù)內(nèi)聯(lián)可以在編譯期間將函數(shù)的定義嵌入到函數(shù)調(diào)用點(diǎn)處,從而消除了函數(shù)調(diào)用的開銷,提高了程序的運(yùn)行效率。使用函數(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ù)進(jìn)行內(nèi)聯(lián)優(yōu)化。需要注意的是,在進(jìn)行內(nèi)聯(lián)優(yōu)化時,并不是所有的函數(shù)都適合進(jìn)行內(nèi)聯(lián)。如果一個函數(shù)的計算量比較大,或者參數(shù)較多,內(nèi)聯(lián)將會使代碼量變大、可維護(hù)性降低、編譯器時間增加,反而會導(dǎo)致程序效率降低。在進(jìn)行函數(shù)內(nèi)聯(lián)時,我們需要根據(jù)具體情況進(jìn)行判斷,謹(jǐn)慎地選擇需要進(jìn)行內(nèi)聯(lián)優(yōu)化的函數(shù)。如下測試代碼:
#include <iostream>inline int Max(int a, int b) { return a > b ? a : b;}int main(){ std::cout << Max(1, 2) << std::endl; return 0;}
C++函數(shù)思想|函數(shù)重載
在 C++ 中,函數(shù)重載(Function Overloading)是一種允許在同一作用域內(nèi)聲明多個具有相同名稱但參數(shù)不同的函數(shù)的機(jī)制。通過函數(shù)重載,我們可以用一個函數(shù)名稱實(shí)現(xiàn)多種不同的功能,這使得代碼更加靈活和易于維護(hù)。
函數(shù)重載的規(guī)則和注意事項(xiàng)如下:
如下測試代碼:
#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ù)名實(shí)現(xiàn)不同功能的函數(shù),而無需使用不同的函數(shù)名稱。在實(shí)際編程中,我們可以根據(jù)具體情況選擇是否使用函數(shù)重載來強(qiáng)化代碼的可重用性和擴(kuò)展性。
C++函數(shù)思想|函數(shù)缺省
在 C++ 中,函數(shù)參數(shù)的缺?。―efault Arguments)是一種在函數(shù)參數(shù)列表中為參數(shù)提供默認(rèn)值的機(jī)制。當(dāng)調(diào)用帶有缺省參數(shù)的函數(shù)時,如果沒有為該參數(shù)傳遞值,則該參數(shù)將采用默認(rèn)值。缺省必須從右往左缺省。通過使用函數(shù)缺省,我們可以簡化函數(shù)接口,避免代碼的冗余以及提高代碼的靈活性。測試代碼如下:
#include <iostream>int Sum(int a, int b = 0, int c = 0, int d=0){ return a + b + c + d;}//錯誤寫法//int Sum(int a=0, int b = 0, int c = 0, int d)//int Sum(int a, int b = 0, int c , int d=0)int main(){ //a=1,b=0,c=0,d=0 std::cout << Sum(1) << std::endl; //a=1,b=2,c=0,d=0 std::cout << Sum(1, 2) << std::endl; //a=1,b=2,c=3,d=0 std::cout << Sum(1, 2, 3) << std::endl; //a=1,b=2,c=3,d=4 std::cout << Sum(1, 2, 3, 4) << std::endl; return 0;}
函數(shù)缺省是 C++ 中重要的一個特性,它可以為參數(shù)列表中的參數(shù)提供默認(rèn)值,使得使用函數(shù)變得更加便捷、自然和安全。在實(shí)際開發(fā)中,我們可以利用函數(shù)缺省來減少代碼重復(fù)、提高代碼的可維護(hù)性以及增強(qiáng)代碼的靈活性。
如果閣下正好在學(xué)習(xí)C/C++,看文章比較無聊,不妨關(guān)注下關(guān)注下小編的視頻教程,通俗易懂,深入淺出,一個視頻只講一個知識點(diǎn)。視頻不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢。
聯(lián)系客服