摘要:在大型的工程中,自己定義的變量函數(shù),類名與其他人定義的相沖突等問題。使用標(biāo)準(zhǔn)輸出控制臺和標(biāo)準(zhǔn)輸入鍵盤時(shí),必須包含頭文件以及標(biāo)準(zhǔn)命名空間。缺省參數(shù)概念缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值。
目錄
經(jīng)過前面對C語言和數(shù)據(jù)結(jié)構(gòu)初階的學(xué)習(xí),自己也初步進(jìn)入了編程的世界。
從最初的興趣至極,到熱情消減,轉(zhuǎn)至平淡,再到現(xiàn)在代碼已經(jīng)逐漸為生活的一部分。
越發(fā)感覺代碼的奇妙,編程世界的廣闊無垠。
希望兩年后的自己回首往昔,能夠?yàn)橹袊@~
感謝各位讀者的點(diǎn)贊與支持,與君共勉!
從本章開始,將進(jìn)入C++學(xué)習(xí)階段。
在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局作用域中,可能會導(dǎo)致很多沖突。
使用命名空間的目的是對標(biāo)識符的名稱進(jìn)行本地化,以避免命名沖突或名字污染,namespace關(guān)鍵字的出現(xiàn)就是針對這種問題的。
?例如:自己定義的變量(函數(shù),類)名與C++內(nèi)置函數(shù)名等沖突,在C語言中是解決不了的。
? ? ? ? ? ? 在大型的工程中,自己定義的變量(函數(shù),類)名與其他人定義的相沖突等問題。
定義命名空間,需要使用到namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對{}即可,{}中即為命名空間的成員。
</>復(fù)制代碼
//1. 普通的命名空間namespace N1 // N1為命名空間的名稱{
// 命名空間中的內(nèi)容,既可以定義變量,也可以定義函數(shù)
int a;
int Add(int left, int right)
{
return left + right;
}}//2. 命名空間可以嵌套namespace N2{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace N3
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}}//3. 同一個(gè)工程中允許存在多個(gè)相同名稱的命名空間,編譯器最后會合成同一個(gè)命名空間中。namespace N1{
int Mul(int left, int right)
{
return left * right;
}}
注意:一個(gè)命名空間就定義了一個(gè)新的作用域,命名空間中的所有內(nèi)容都局限于該命名空間中。
命名空間是一個(gè)作用域,如果在使用的里面的變量時(shí),只寫變量名,編譯器肯定是無法識別的。
例如:
</>復(fù)制代碼
namespace N{ int a = 10; int b = 20; int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; }}int main(){ printf("%d/n", a); // 該語句編譯出錯(cuò),無法識別變量a return 0;}
那該如何使用命名空間中的成員呢?
這里有三種方法:
方法1:加命名空間名稱及作用域限定符(::) (最安全可靠,但使用時(shí)不太方便)
</>復(fù)制代碼
int main(){ printf("%d/n", N::a); return 0;}
方法二:使用using將命名空間中成員引入 (展開命名空間中常用的成員)
</>復(fù)制代碼
using N::b; // 展開后,后續(xù)可直接使用int main(){ printf("%d/n", N::a); printf("%d/n", b); return 0;}
方法三:使用using namespace 命名空間名稱引入(不可靠,在項(xiàng)目中不能使用該方法) (展開命名空間中所有成員)
</>復(fù)制代碼
using namespce N;int main(){ printf("%d/n", N::a); printf("%d/n", b); Add(10, 20); return 0;}
注意:
</>復(fù)制代碼
namespace N{
int a;// 定義變量a,未初始化
a = 0;// 不能在命名空間中賦值
int b = 10;// 定義變量b,同時(shí)初始化}
C++中有新的輸入和輸出方式,但C++是包容C語言的,所以C語言中對的輸入和輸出在C++中同樣適用。
Hello world!!!?
</>復(fù)制代碼
#includeusing namespace std;int main(){ cout<<"Hello world!!!"<
</>復(fù)制代碼
對于上面的代碼,你是否有許多疑惑,沒關(guān)系我們來依次解答。
- ?使用cout標(biāo)準(zhǔn)輸出(控制臺)和cin標(biāo)準(zhǔn)輸入(鍵盤)時(shí),必須包含< iostream >頭文件以及std標(biāo)準(zhǔn)命名空間。
- 在平常寫代碼練習(xí)時(shí),我們可以直接將std命名空間展開。
- C++中的輸入是 cin 輸出是 cout 。
- 至于>>和<<表示將數(shù)據(jù)輸入和輸出到流,也可以表示移位運(yùn)算(在C++中被重載了,后面會將這里不用深究)
- endl(end line)表示換行。
- ?使用C++輸入輸出更方便,不需增加數(shù)據(jù)格式控制,比如:整形--%d,字符--%c。
注意:早期標(biāo)準(zhǔn)庫將所有功能在全局域中實(shí)現(xiàn),聲明在.h后綴的頭文件中,使用時(shí)只需包含對應(yīng)頭文件即可,后來將其實(shí)現(xiàn)在std命名空間下,為了和C頭文件區(qū)分,也為了正確使用命名空間,規(guī)定C++頭文件不帶.h;舊編譯器(vc 6.0)中還支持格式,后續(xù)編譯器已不支持,因此推薦使用+std的方式。
3.缺省參數(shù)
3.1概念
缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值。
在調(diào)用該函數(shù)時(shí),如果沒有指定實(shí)參則采用該默認(rèn)值,否則使用指定的實(shí)參。
例如:
</>復(fù)制代碼
編譯結(jié)果:
3.2缺省參數(shù)分類
- 全缺省參數(shù)
</>復(fù)制代碼
// 函數(shù)中所有參數(shù)都指定默認(rèn)值void TestFunc(int a = 10, int b = 20, int c = 30){ cout<<"a = "<//函數(shù)中部分參數(shù)指定默認(rèn)值void TestFunc(int a, int b = 10, int c = 20){ cout<<"a = "<//下面兩種均是錯(cuò)誤寫法!void TestFunc(int a = 10, int b, int c)void TestFunc(int a = 10, int b, int c = 30)//a.h(聲明)void TestFunc(int a = 10);// a.c(定義)void TestFunc(int a = 20){}// 注意:如果生命與定義位置同時(shí)出現(xiàn),恰巧兩個(gè)位置提供的值不同,那編譯器就無法確定到底該用那個(gè)缺省值。
4.函數(shù)重載
4.1概念
函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個(gè)數(shù) 或 類型 或 順序)必須不同,常用來處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問題。
</>復(fù)制代碼
int Add(int a, int b){ return a + b;}double Add(double a, double b){ return a + b;}long Add(long a, long b){ return a + b;}int main(){ Add(10, 20); Add(10.0, 20.0); Add(10L, 20L); return 0;}//上面的函數(shù)功能相同,函數(shù)名相同,參數(shù)類型不同。//當(dāng)然這里的重載函數(shù)還可以 參數(shù)個(gè)數(shù)不同,參數(shù)順序不同
下面兩個(gè)函數(shù)屬于函數(shù)重載嗎?
</>復(fù)制代碼
short Add(short a, short b){ return a + b;}int Add(short a, short b){ return a + b;}// 注意:上面兩個(gè)函數(shù)不屬于函數(shù)重載,返回值不是定義函數(shù)重載的標(biāo)準(zhǔn),調(diào)用的時(shí)候不能區(qū)分
</>復(fù)制代碼
// 1、缺省值不同,不能構(gòu)成重載void f(int a){
cout << "f()" << endl;}void f(int a = 0){
cout << "f(int a)" << endl;}// 2、構(gòu)成重載,但是使用時(shí)會有問題 : f(); // 調(diào)用存在歧義void f(){
cout << "f()" << endl;}void f(int a = 0){
cout << "f(int a)" << endl;}
4.2名字修飾(name Mangling)
為什么C++支持函數(shù)重載,而C語言不支持函數(shù)重載呢?
在C/C++中,一個(gè)程序要運(yùn)行起來,需要經(jīng)歷以下幾個(gè)階段:預(yù)處理、編譯、匯編、鏈接。
1. 實(shí)際我們的項(xiàng)目通常是由多個(gè)頭文件和多個(gè)源文件構(gòu)成,而通過我們C語言階段學(xué)習(xí)的編譯鏈接,我們可以知道,【當(dāng)前a.cpp中調(diào)用了b.cpp中定義的Add函數(shù)時(shí)】,編譯后鏈接前,a.o的目標(biāo)文件中沒有Add的函數(shù)地址,因?yàn)锳dd是在b.cpp中定義的,所以Add的地址在b.o中。那么怎么辦呢?
2. 所以鏈接階段就是專門處理這種問題,鏈接器看到a.o調(diào)用Add,但是沒有Add的地址,就會到b.o的符號表中找Add的地址,然后鏈接到一起。
3. 那么鏈接時(shí),面對Add函數(shù),連接器會使用哪個(gè)名字去找呢?這里每個(gè)編譯器都有自己的函數(shù)名修飾規(guī)則。
4. 由于Windows下vs的修飾規(guī)則過于復(fù)雜,而Linux下gcc的修飾規(guī)則簡單易懂,下面我們使用了gcc演示了這個(gè)修飾后的名字。
5. 通過下面我們可以看出gcc的函數(shù)修飾后名字不變。而g++的函數(shù)修飾后變成【_Z+函數(shù)長度+函數(shù)名+類型首字母】。
采用C語言編譯器編譯后結(jié)果
?
?結(jié)論:在linux下,采用gcc編譯完成后,函數(shù)名字的修飾沒有發(fā)生改變
?
采用C++編譯器編譯后結(jié)果
結(jié)論:在linux下,采用g++編譯完成后,函數(shù)名字的修飾發(fā)生改變,編譯器將函數(shù)參數(shù)類型信息
添加到修改后的名字中
?
Windows下名字修飾規(guī)則比較復(fù)雜,這里不再講解。
6. 通過這里就理解了C語言沒辦法支持重載,因?yàn)橥瘮?shù)沒辦法區(qū)分。而C++是通過函數(shù)修飾規(guī)則來區(qū)分,只要參數(shù)不同,修飾出來的名字就不一樣,就支持了重載。
7. 另外我們也理解了,為什么函數(shù)重載要求參數(shù)不同!而跟返回值沒關(guān)系。
5.extern “C”
?
有時(shí)候在C++工程中可能需要將某些函數(shù)按照C的風(fēng)格來編譯,在函數(shù)前加extern "C",意思是告訴編譯器,將該函數(shù)按照C語言規(guī)則來編譯(例如函數(shù)名修飾規(guī)則)。
</>復(fù)制代碼
extern "C" int Add(int a, int b);int main(){ Add(1,2); return 0;}
6.引用
6.1概念
引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。
類型& 引用變量名(對象名) = 引用實(shí)體
?
</>復(fù)制代碼
void TestRef(){ int a = 10; int& ra = a;//<====定義引用類型 printf("%p/n", &a); printf("%p/n", &ra);}
?注意:引用類型必須和引用實(shí)體是同種類型的
從上圖結(jié)果可以看出,ra 和 a 共同一塊空間。
?6.2 引用特性
?
1. 引用在定義時(shí)必須初始化
2. 一個(gè)變量可以有多個(gè)引用
3. 引用一旦引用一個(gè)實(shí)體,再不能引用其他實(shí)體
</>復(fù)制代碼
void TestRef(){ int a = 10; // int& ra; // 該條語句編譯時(shí)會出錯(cuò) int& ra = a;// 一個(gè)變量可以有多個(gè)引用 int& rra = a; printf("%p %p %p/n", &a, &ra, &rra);}
6.3 常引用
在引用常量時(shí),需在類型前加const。
引用時(shí)如存在隱式類型轉(zhuǎn)換,也需在類型前加const,且這時(shí)引用的不是變量本身,而是隱式類型轉(zhuǎn)換時(shí)的臨時(shí)空間。
</>復(fù)制代碼
void TestConstRef(){ const int a = 10; //int& ra = a; // 該語句編譯時(shí)會出錯(cuò),a為常量 const int& ra = a; // int& b = 10; // 該語句編譯時(shí)會出錯(cuò),b為常量 const int& b = 10; double d = 12.34; //int& rd = d; // 該語句編譯時(shí)會出錯(cuò),類型不同 const int& rd = d;}
?
6.4 使用場景
1. 做參數(shù)
</>復(fù)制代碼
void Swap(int& a, int& b)//因?yàn)橐檬褂玫氖亲兞吭臻g,所以可以直接交換{ int temp = a; a = b; b = temp;}
2. 做返回值
由于存在棧中的地址,在函數(shù)結(jié)束后回還給操作系統(tǒng),所以引用做返回值時(shí),不能用棧中的地址。
</>復(fù)制代碼
int& Add(int a, int b){ int c = a + b; return c;}int main(){ int& ret = Add(1, 2); Add(3, 4); cout << "Add(1, 2) is :"<< ret <
這里的c是局部變量,引用做返回值,返回的是c的別名,而c已經(jīng)被還給操作系統(tǒng)了。
?這里的結(jié)果是:
了解函數(shù)棧幀的朋友應(yīng)該知道,第一次調(diào)用Add函數(shù)之后,c空間就被釋放了,但這塊空間還是存在于棧中的,而且里面的值(3)沒有被修改;
第二次調(diào)用Add后會在相同的地址開辟c空間,這時(shí)里面的值就被第二次得到的結(jié)果覆蓋了,所以輸出這塊空間中的值時(shí)得到的是?7。
</>復(fù)制代碼
int& Count(){ static int n = 0;// 加上static之后該變量就被存放在靜態(tài)區(qū)中,函數(shù)返回后該空間不會被釋放 n++; // ... return n;}
注意:如果函數(shù)返回時(shí),出了函數(shù)作用域,如果返回對象還未還給系統(tǒng),則可以使用引用返回,如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。
?
6.5?引用和指針的區(qū)別
在語法概念上引用就是一個(gè)別名,沒有獨(dú)立空間,和其引用實(shí)體共用同一塊空間。
在底層實(shí)現(xiàn)上實(shí)際是有空間的,因?yàn)?strong>引用是按照指針方式來實(shí)現(xiàn)的。
</>復(fù)制代碼
int main(){
int a = 10;
int& ra = a;
ra = 20;
int* pa = &a;
*pa = 20;
return 0;}
?匯編代碼比較:
引用和指針的不同點(diǎn):
- ?引用在定義時(shí)必須初始化,指針沒有要求
- ?引用在初始化時(shí)引用一個(gè)實(shí)體后,就不能再引用其他實(shí)體,而指針可以在任何時(shí)候指向任何一個(gè)同類型實(shí)體
- ?沒有NULL引用,但有NULL指針
- ?在sizeof中含義不同:引用結(jié)果為引用類型的大小,但指針始終是地址空間所占字節(jié)個(gè)數(shù)(32位平臺下占4個(gè)字節(jié))
- ?引用自加即引用的實(shí)體增加1,指針自加即指針向后偏移一個(gè)類型的大小
- ?有多級指針,但是沒有多級引用
- 訪問實(shí)體方式不同,指針需要顯式解引用,引用編譯器自己處理
- ?引用比指針使用起來相對更安全
7. 內(nèi)聯(lián)函數(shù)
7.1 概念
以inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時(shí)C++編譯器會在調(diào)用內(nèi)聯(lián)函數(shù)的地方展開,沒有函數(shù)壓棧的開銷,內(nèi)聯(lián)函數(shù)提升程序運(yùn)行的效率。
如果不是內(nèi)聯(lián)函數(shù),使用時(shí)會有調(diào)用函數(shù)的操作:
如果在上述函數(shù)前增加inline關(guān)鍵字將其改成內(nèi)聯(lián)函數(shù),在編譯期間編譯器會用函數(shù)體替換函數(shù)的調(diào)用。不會有函數(shù)壓棧的開銷。
7.2 特性
1. inline是一種以空間換時(shí)間的做法,省去調(diào)用函數(shù)額開銷。所以代碼很長或者有循環(huán)/遞歸的函數(shù)不適宜使用作為內(nèi)聯(lián)函數(shù)。
2. inline對于編譯器而言只是一個(gè)建議,編譯器會自動優(yōu)化,如果定義為inline的函數(shù)體內(nèi)有循環(huán)/遞歸等等,編譯器優(yōu)化時(shí)會忽略掉內(nèi)聯(lián)。
3. inline不建議聲明和定義分離,分離會導(dǎo)致鏈接錯(cuò)誤。因?yàn)閕nline被展開,就沒有函數(shù)地址了,鏈接就會找不到。
4.頻繁使用的小函數(shù),可以定義成內(nèi)聯(lián)函數(shù)
例如:
</>復(fù)制代碼
// F.h#include using namespace std;inline void f(int i);// F.cpp#include "F.h"void f(int i){ cout << i << endl;}// main.cpp#include "F.h"int main(){ f(10); return 0;}
上面這段代碼,在main函數(shù)中f函數(shù)的聲明和定義是分離的,在F.h展開后,f函數(shù)也會被直接展開,而F.h中只有聲明,在鏈接時(shí)找不到f函數(shù)的地址,程序就會出現(xiàn)鏈接錯(cuò)誤。
8. auto關(guān)鍵字(C++11)
8.1 auto簡介
在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有人去使用它。
C++11中,標(biāo)準(zhǔn)委員會賦予了auto全新的含義即:auto不再是一個(gè)存儲類型指示符,而是作為一個(gè)新的類型指示符來指示編譯器,auto聲明的變量必須由編譯器在編譯時(shí)期推導(dǎo)而得。
?
</>復(fù)制代碼
int TestAuto(){ return 10;}int main(){ int a = 10; auto b = a;//auto自動識別a的類型 auto c = "a"; auto d = TestAuto(); cout << typeid(b).name() << endl;//C++中tyoeid().name可以輸出變量類型 cout << typeid(c).name() << endl; cout << typeid(d).name() << endl; //auto e; 無法通過編譯,使用auto定義變量時(shí)必須對其進(jìn)行初始化 return 0;}
【注意】
使用auto定義變量時(shí)必須對其進(jìn)行初始化,在編譯階段編譯器需要根據(jù)初始化表達(dá)式來推導(dǎo)auto的實(shí)際類型。因此auto并非是一種“類型”的聲明,而是一個(gè)類型聲明時(shí)的“占位符”,編譯器在編譯期會將auto替換為變量實(shí)際的類型。
?
8.2 auto的使用
1. auto與指針和引用結(jié)合起來使用
用auto聲明指針類型時(shí),用auto和auto*沒有任何區(qū)別,但用auto聲明引用類型時(shí)則必須加&?
</>復(fù)制代碼
int main(){ int x = 10; auto a = &x; auto* b = &x; auto& c = x; cout << typeid(a).name() << endl; cout << typeid(b).name() << endl; cout << typeid(c).name() << endl; *a = 20; *b = 30; c = 40; return 0;}
2. 在同一行定義多個(gè)變量
當(dāng)在同一行聲明多個(gè)變量時(shí),這些變量必須是相同的類型,否則編譯器將會報(bào)錯(cuò),因?yàn)榫幾g器實(shí)際只對第一個(gè)類型進(jìn)行推導(dǎo),然后用推導(dǎo)出來的類型定義其他變量。
</>復(fù)制代碼
void TestAuto(){ auto a = 1, b = 2; auto c = 3, d = 4.0; // 該行代碼會編譯失敗,因?yàn)閏和d的初始化表達(dá)式類型不同}
?
8.3 auto不能推導(dǎo)的場景
1. auto不能作為函數(shù)的參數(shù)
</>復(fù)制代碼
// 此處代碼編譯失敗,auto不能作為形參類型,因?yàn)榫幾g器無法對a的實(shí)際類型進(jìn)行推導(dǎo)void TestAuto(auto a){}
2. auto不能直接用來聲明數(shù)組
</>復(fù)制代碼
void TestAuto(){ int a[] = {1,2,3}; auto b[] = {4,5,6};}
3. 為了避免與C++98中的auto發(fā)生混淆,C++11只保留了auto作為類型指示符的用法
4. auto在實(shí)際中最常見的優(yōu)勢用法就是跟C++11提供的新式for循環(huán),還有l(wèi)ambda表達(dá)式等進(jìn)行配合使用。
9. 基于范圍的for循環(huán)(C++11)
9.1 范圍for的語法
在C++98中如果要遍歷一個(gè)數(shù)組,可以按照以下方式進(jìn)行:
</>復(fù)制代碼
void TestFor(){ int array[] = { 1, 2, 3, 4, 5 }; for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i) array[i] *= 2; for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p) cout << *p << endl;}
對于一個(gè)有范圍的集合而言,由程序員來說明循環(huán)的范圍是多余的,有時(shí)候還會容易犯錯(cuò)誤。
因此C++11中引入了基于范圍的for循環(huán)。
for循環(huán)后的括號由冒號“ :”分為兩部分:第一部分是范圍內(nèi)用于迭代的變量,第二部分則表示被迭代的范圍。
?
</>復(fù)制代碼
void TestFor(){ int array[] = { 1, 2, 3, 4, 5 }; for(auto& e : array) e *= 2; for(auto e : array) cout << e << " "; return 0;}
注意:與普通循環(huán)類似,可以用continue來結(jié)束本次循環(huán),也可以用break來跳出整個(gè)循環(huán)。
?
9.2 范圍for的使用條件
?
1. for循環(huán)迭代的范圍必須是確定的
對于數(shù)組而言,就是數(shù)組中第一個(gè)元素和最后一個(gè)元素的范圍;對于類而言,應(yīng)該提供begin和end的方法,begin和end就是for循環(huán)迭代的范圍。
注意:以下代碼就有問題,因?yàn)閒or的范圍不確定
</>復(fù)制代碼
void TestFor(int array[]){ for(auto& e : array) cout<< e <
2. 迭代的對象要實(shí)現(xiàn)++和==的操作。
?
10. 指針空值nullptr(C++11)
在良好的C/C++編程習(xí)慣中,聲明一個(gè)變量時(shí)最好給該變量一個(gè)合適的初始值,否則可能會出現(xiàn)不可預(yù)料的錯(cuò)誤,比如未初始化的指針。
如果一個(gè)指針沒有合法的指向,我們基本都是按照如下方式對其進(jìn)行初始化:
?
</>復(fù)制代碼
void TestPtr(){ int* p1 = NULL; int* p2 = 0; // ……}
NULL實(shí)際是一個(gè)宏,在傳統(tǒng)的C頭文件(stddef.h)中,可以看到如下代碼:
</>復(fù)制代碼
#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif#endif
可以看到,NULL可能被定義為字面常量0,或者被定義為無類型指針(void*)的常量。不論采取何種定義,在使用空值的指針時(shí),都不可避免的會遇到一些麻煩,比如:
?
</>復(fù)制代碼
void f(int){ cout<<"f(int)"<
結(jié)果如下:
?
?
程序本意是想通過f(NULL)調(diào)用指針版本的f(int*)函數(shù),但是由于NULL被定義成0,因此與程序的初衷相悖。
在C++98中,字面常量0既可以是一個(gè)整形數(shù)字,也可以是無類型的指針(void*)常量,但是編譯器默認(rèn)情況下將其看成是一個(gè)整形常量,如果要將其按照指針方式來使用,必須對其進(jìn)行強(qiáng)轉(zhuǎn)(void *)0。
注意:
1. 在使用nullptr表示指針空值時(shí),不需要包含頭文件,因?yàn)閚ullptr是C++11作為新關(guān)鍵字引入的。
2. 在C++11中,sizeof(nullptr) 與 sizeof((void*)0)所占的字節(jié)數(shù)相同。
3. 為了提高代碼的健壯性,在后續(xù)表示指針空值時(shí)建議最好使用nullptr。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/125659.html
相關(guān)文章
-
某熊的技術(shù)之路指北 ?
某熊的技術(shù)之路指北 ?
當(dāng)我們站在技術(shù)之路的原點(diǎn),未來可能充滿了迷茫,也存在著很多不同的可能;我們可能成為 Web/(大)前端/終端工程師、服務(wù)端架構(gòu)工程師、測試/運(yùn)維/安全工程師等質(zhì)量保障、可用性保障相關(guān)的工程師、大數(shù)據(jù)/云計(jì)算/虛擬化工程師、算法工程師、產(chǎn)品經(jīng)理等等某個(gè)或者某幾個(gè)角色。某熊的技術(shù)之路系列文章/書籍/視頻/代碼即是筆者蹣跚行進(jìn)于這條路上的點(diǎn)滴印記,包含了筆者作為程序員的技術(shù)視野、...
-
十年鏟碼,八大體系超千篇數(shù)百萬字技術(shù)筆記系列匯總(GitBook 悅享版)
摘要:十年鏟碼,八大體系超千篇數(shù)百萬字技術(shù)筆記系列匯總悅享版十年鏟碼兩茫茫,縱思量,卻易忘不覺筆者步入程序員已有十年。十年之期,正巧筆者從阿里離開,重回打印制造業(yè)的懷抱,希望能依托于設(shè)備優(yōu)勢逐步真正構(gòu)建分布式制造網(wǎng)絡(luò)。
showImg(https://segmentfault.com/img/remote/1460000020151971);
十年鏟碼,八大體系超千篇數(shù)百萬字技術(shù)筆記系列匯總...
發(fā)表評論
0條評論
不知名網(wǎng)友
男|高級講師
TA的文章
閱讀更多
Oracle數(shù)據(jù)庫4031故障分析
閱讀 3789·2023-01-11 11:02
Oceanbase新版本復(fù)合分區(qū)添加分區(qū)操作
閱讀 4296·2023-01-11 11:02
VRRP高可用
閱讀 3115·2023-01-11 11:02
Docker技術(shù)之構(gòu)建鏡像和網(wǎng)絡(luò)模式解析
閱讀 5230·2023-01-11 11:02
?CISCO 4500 主引擎版故障處理
閱讀 4792·2023-01-11 11:02
大數(shù)據(jù)開發(fā)系列五:kafka& zookeeper 配置kerberos認(rèn)證
閱讀 5565·2023-01-11 11:02
自研實(shí)時(shí)計(jì)算模塊介紹及運(yùn)維數(shù)據(jù)應(yīng)用場景實(shí)施
閱讀 5368·2023-01-11 11:02
DataX的限速與調(diào)優(yōu)
閱讀 4066·2023-01-11 11:02
閱讀需要支付1元查看
<