這篇文章主要為大家展示了“C++中this指針、靜態(tài)成員、常量成員函數(shù)的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C++中this指針、靜態(tài)成員、常量成員函數(shù)的示例分析”這篇文章吧。
十年的平壩網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整平壩建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“平壩網(wǎng)站設(shè)計(jì)”,“平壩網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
一、this指針
1、C++程序到C程序的翻譯
class CCar { struct CCar { public: int price; int price; }; void SetPrice(int p); void SetPrice(struct CCar * this,int p){ }; this->price = p; void CCar::SetPrice(int p){ } price = p; //this->price = p; } int main() { int main(){ struct CCar car; CCar car; SetPrice( & car,20000); car.SetPrice(20000); return 0; return 0; } }
2、this指針作用:非靜態(tài)成員函數(shù)中可以直接使用this來代表指向該函數(shù)作用的對象的指針
3、this指針和靜態(tài)成員函數(shù):靜態(tài)成員函數(shù)并不具體作用與某個(gè)對象,所以靜態(tài)成員函數(shù)中不能使用 this 指針
二、靜態(tài)成員
靜態(tài)成員:在說明前面加了static關(guān)鍵字的成員。
普通成員變量每個(gè)對象有各自的一份,而靜態(tài)成員變量一共就一份,為所有對象共享,sizeof 運(yùn)算符不會(huì)計(jì)算靜態(tài)成員變量。
普通成員函數(shù)必須具體作用于某個(gè)對象,而靜態(tài)成員函數(shù)并不具體作用于某個(gè)對象,不需要通過對象就能訪問。
class CRectangle{ private: int w, h; static int nTotalArea; // 靜態(tài)成員變量 public: CRectangle(int w_,int h_); ~CRectangle(); static void PrintTotal(); // 靜態(tài)成員函數(shù) };
1、訪問靜態(tài)成員的方法:
類名::成員名 CRectangle::PrintTotal();
對象名.成員名 CRectangle r; r.PrintTotal();
指針->成員名 CRectangle * p = &r; p->PrintTotal();
引用.成員名 CRectangle & ref = r; int n = ref.nTotalNumber;
2、注意事項(xiàng):
靜態(tài)成員變量本質(zhì)上是全局變量,哪怕一個(gè)對象都不存在,類的靜態(tài)成員變量也存在
必須在定義類的文件中對靜態(tài)成員變量進(jìn)行一次說明或初始化。否則編譯能通過,鏈接不能通過
在靜態(tài)成員函數(shù)中,不能訪問非靜態(tài)成員變量,也不能調(diào)用非靜態(tài)成員函數(shù)
三、成員對象和封閉類
1、定義:有成員對象的類叫 封閉(enclosing)類
class CTyre{ // 輪胎類 private: int radius; // 半徑 int width; // 寬度 public: CTyre(int r,int w):radius(r),width(w) { } }; class CEngine{ // 引擎類 }; class CCar { // 汽車類 private: int price; // 價(jià)格 CTyre tyre; CEngine engine; public: CCar(int p,int tr,int tw ); }; CCar::CCar(int p,int tr,int w):price(p),tyre(tr, w){}; int main(){ CCar car(20000,17,225); return 0; }
上例中,如果 CCar類不定義構(gòu)造函數(shù), 則下面的語句會(huì)編譯出錯(cuò):CCar car;因?yàn)榫幾g器不明白 car.tyre該如何初始化。car.engine 的初始化沒問題,用默認(rèn)構(gòu)造函數(shù)即可。任何生成封閉類對象的語句,都要讓編譯器明白,對象中的成員對象,是如何初始化的。具體的做法就是:通過封閉類的構(gòu)造函數(shù)的初始化列表。
2、封閉類構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行順序
封閉類對象生成時(shí),先執(zhí)行所有對象成員的構(gòu)造函數(shù),然后才執(zhí)行封閉類的構(gòu)造函數(shù)。
對象成員的構(gòu)造函數(shù)調(diào)用次序和對象成員在類中的說明次序一致,與它們在成員初始化列表中出現(xiàn)的次序無關(guān)。
當(dāng)封閉類的對象消亡時(shí),先執(zhí)行封閉類的析構(gòu)函數(shù),然后再執(zhí)行成員對象的析構(gòu)函數(shù)。次序和構(gòu)造函數(shù)的調(diào)用次序相反。
class CTyre { public: CTyre() { cout << "CTyre contructor" << endl; } ~CTyre() { cout << "CTyre destructor" << endl; } }; class CEngine { public: CEngine() { cout << "CEngine contructor" << endl; } ~CEngine() { cout << "CEngine destructor" << endl; } }; class CCar { private: CEngine engine; CTyre tyre; public: CCar( ) { cout << “CCar contructor” << endl; } ~CCar() { cout << "CCar destructor" << endl; } }; int main(){ CCar car; return 0; } //輸出結(jié)果: CEngine contructor CTyre contructor CCar contructor CCar destructor CTyre destructor CEngine destructor
四、友元(friends)
1、友元分為友元函數(shù)和友元類兩種
(1)友元函數(shù) : 一個(gè)類的友元函數(shù)可以訪問該類的私有成員
class CCar ; //提前聲明 CCar 類,以便后面的CDriver 類使用 class CDriver{ public: void ModifyCar( CCar * pCar) ; // 改裝汽車 }; class CCar{ private: int price; friend int MostExpensiveCar( CCar cars[], int total); // 聲明友元 friend void CDriver::ModifyCar(CCar * pCar); // 聲明友元,可包括構(gòu)造、析構(gòu)函數(shù) }; void CDriver::ModifyCar( CCar * pCar){ pCar->price += 1000; // 汽車改裝后價(jià)值增加 } int MostExpensiveCar( CCar cars[],int total){ // 求最貴汽車的價(jià)格 int tmpMax = -1; for( int i = 0;i < total; ++i ) if( cars[i].price > tmpMax) tmpMax = cars[i].price; return tmpMax; }
(2)友元類 : 如果A 是B的友元類,那么A 的成員函數(shù)可以訪問B的私有成員,友元類之間的關(guān)系不能傳遞,不能繼承
class B{ friend class A; // 聲明A為友元類 };
五、常量成員函數(shù)
1、作用:如果不希望某個(gè)對象的值被改變,則定義該對象的時(shí)候可以在前面加 const關(guān)鍵字
在類的成員函數(shù)說明后面可以加const關(guān)鍵字,則該成員函數(shù)成為常量成員函數(shù)。
常量成員函數(shù)內(nèi)部不能改變屬性的值,也不能調(diào)用非常量成員函數(shù)
在定義常量成員函數(shù)和聲明常量成員函數(shù)時(shí)都應(yīng)該使用const 關(guān)鍵字
class Sample { private : int value; public: Sample() { } void SetValue() { } }; const Sample Obj; // 常量對象 Obj.SetValue (); //錯(cuò)誤,常量對象只能使用構(gòu)造函數(shù)、析構(gòu)函數(shù)和有const說明的函數(shù)(常量方法)
2、常量成員函數(shù)的重載:兩個(gè)函數(shù),名字和參數(shù)表都一樣,但是一個(gè)是const,一個(gè)不是,算重載
3、mutable成員變量:
(1)作用:mutable突破const的限制而設(shè)置,被mutable修飾的變量將永遠(yuǎn)處于可變的轉(zhuǎn)態(tài),即使在一個(gè)const函數(shù)中。
(2)應(yīng)用:如果類的成員函數(shù)不會(huì)改變對象的狀態(tài),那么一般會(huì)聲明成const。但是,有些時(shí)候,需要在const的函數(shù)里面修改一些跟類狀態(tài)無關(guān)的數(shù)據(jù)成員,那么這些數(shù)據(jù)成員就應(yīng)該被mutable來修飾。
class CTest{ public: bool GetData() const{ m_n1++; return m_b2; } private: mutable int m_n1; bool m_b2; };
以上是“C++中this指針、靜態(tài)成員、常量成員函數(shù)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!