const
作用
修飾變量,說(shuō)明該變量不可以被改變;
修飾指針,分為指向常量的指針(pointer to const)和自身是常量的指針(常量指針,const pointer);
修飾引用,指向常量的引用(reference to const),用于形參類(lèi)型,即避免了拷貝,又避免了函數(shù)對(duì)值的修改;
修飾成員函數(shù),說(shuō)明該成員函數(shù)內(nèi)不能修改成員變量。
const 的指針與引用
指針
指向常量的指針(pointer to const)
自身是常量的指針(常量指針,const pointer)
引用
指向常量的引用(reference to const)
沒(méi)有 const reference,因?yàn)橐弥皇菍?duì)象的別名,引用不是對(duì)象,不能用 const 修飾
(為了方便記憶可以想成)被 const 修飾(在 const 后面)的值不可改變,如下文使用例子中的 p2、p3
const 使用
// 類(lèi)class A{private: const int a; // 常對(duì)象成員,可以使用初始化列表或者類(lèi)內(nèi)初始化 public: // 構(gòu)造函數(shù) A() : a(0) { }; A(int x) : a(x) { }; // 初始化列表 // const可用于對(duì)重載函數(shù)的區(qū)分
int getValue(); // 普通成員函數(shù) int getValue() const; // 常成員函數(shù),不得修改類(lèi)中的任何數(shù)據(jù)成員的值
}; void function(){ // 對(duì)象 A b; // 普通對(duì)象,可以調(diào)用全部成員函數(shù) const A a; // 常對(duì)象,只能調(diào)用常成員函數(shù) const A *p = &a; // 指針變量,指向常對(duì)象 const A &q = a; // 指向常對(duì)象的引用 // 指針 char greeting[] = “Hello”; char* p1 = greeting; // 指針變量,指向字符數(shù)組變量
const char* p2 = greeting; // 指針變量,指向字符數(shù)組常量(const 后面是 char,說(shuō)明指向的字符(char)不可改變) char* const p3 = greeting; // 自身是常量的指針,指向字符數(shù)組變量(const 后面是 p3,說(shuō)明 p3 指針自身不可改變) const char* const p4 = greeting; // 自身是常量的指針,指向字符數(shù)組常量
} // 函數(shù)void function1(const int Var); // 傳遞過(guò)來(lái)的參數(shù)在函數(shù)內(nèi)不可變void function2(const char* Var); // 參數(shù)指針?biāo)竷?nèi)容為常量void function3(char* const Var); // 參數(shù)指針為常量void function4(const int& Var); // 引用參數(shù)在函數(shù)內(nèi)為常量 // 函數(shù)返回值
const int function5(); // 返回一個(gè)常數(shù)const int* function6(); // 返回一個(gè)指向常量的指針變量,使用:const int *p = function6();int* const function7(); // 返回一個(gè)指向變量的常指針,使用:int* const p = function7();
static
作用
修飾普通變量,修改變量的存儲(chǔ)區(qū)域和生命周期,使變量存儲(chǔ)在靜態(tài)區(qū),在 main 函數(shù)運(yùn)行前就分配了空間,如果有初始值就用初始值初始化它,如果沒(méi)有初始值系統(tǒng)用默認(rèn)值初始化它。
修飾普通函數(shù),表明函數(shù)的作用范圍,僅在定義該函數(shù)的文件內(nèi)才能使用。在多人開(kāi)發(fā)項(xiàng)目時(shí),為了防止與他人命名空間里的函數(shù)重名,可以將函數(shù)定位為 static。
修飾成員變量,修飾成員變量使所有的對(duì)象只保存一個(gè)該變量,而且不需要生成對(duì)象就可以訪問(wèn)該成員。
修飾成員函數(shù),修飾成員函數(shù)使得不需要生成對(duì)象就可以訪問(wèn)該函數(shù),但是在 static 函數(shù)內(nèi)不能訪問(wèn)非靜態(tài)成員。
this 指針
this 指針是一個(gè)隱含于每一個(gè)非靜態(tài)成員函數(shù)中的特殊指針。它指向調(diào)用該成員函數(shù)的那個(gè)對(duì)象。
當(dāng)對(duì)一個(gè)對(duì)象調(diào)用成員函數(shù)時(shí),編譯程序先將對(duì)象的地址賦給 this 指針,然后調(diào)用成員函數(shù),每次成員函數(shù)存取數(shù)據(jù)成員時(shí),都隱式使用 this 指針。
當(dāng)一個(gè)成員函數(shù)被調(diào)用時(shí),自動(dòng)向它傳遞一個(gè)隱含的參數(shù),該參數(shù)是一個(gè)指向這個(gè)成員函數(shù)所在的對(duì)象的指針。
this 指針被隱含地聲明為: ClassName *const this,這意味著不能給 this 指針賦值;在 ClassName 類(lèi)的 const 成員函數(shù)中,this 指針的類(lèi)型為:const ClassName* const,這說(shuō)明不能對(duì) this 指針?biāo)赶虻倪@種對(duì)象是不可修改的(即不能對(duì)這種對(duì)象的數(shù)據(jù)成員進(jìn)行賦值操作);
this 并不是一個(gè)常規(guī)變量,而是個(gè)右值,所以不能取得 this 的地址(不能 &this)。
在以下場(chǎng)景中,經(jīng)常需要顯式引用 this 指針:
為實(shí)現(xiàn)對(duì)象的鏈?zhǔn)揭茫?/p>
為避免對(duì)同一對(duì)象進(jìn)行賦值操作;
在實(shí)現(xiàn)一些數(shù)據(jù)結(jié)構(gòu)時(shí),如 list。
寫(xiě)在最后:對(duì)于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開(kāi)始!
責(zé)任編輯:haq
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135862 -
編程
+關(guān)注
關(guān)注
88文章
3565瀏覽量
93536 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4277瀏覽量
62323
原文標(biāo)題:C++基礎(chǔ)語(yǔ)法梳理:const,static以及 this 指針
文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論