您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“C++內(nèi)存空間怎么分配與this指針如何使用”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
在C++中成員變量和成員函數(shù)是分開存儲的;
class Person {};
這里我直接創(chuàng)建一個(gè)空的類,并創(chuàng)建一個(gè)空的類對象(Person p),利用sizeof關(guān)鍵字輸出p所占內(nèi)存空間,sizeof(p);結(jié)果是p=1;
注意:空對象占用內(nèi)存空間為:
1、C++編譯器會給每個(gè)空對象分配一個(gè)字節(jié)空間,是為了區(qū)分空對象占內(nèi)存的位置
2、每個(gè)空對象也應(yīng)該有一個(gè)獨(dú)一無二的內(nèi)存地址
class Person { public: int m_A; static int m_B; }; int Person::m_B = 100;
首先創(chuàng)建一個(gè)簡單的Person類,僅僅包含普通成員屬性m_A和靜態(tài)成員變量m_B;然后直接利用sizeof關(guān)鍵字輸出p所占內(nèi)存空間:sizeof(p)
這里的結(jié)果是4,而不是8,這是因?yàn)殪o態(tài)成員屬性不屬于類的對象上,無論再加幾個(gè)靜態(tài)成員屬性,都不會改變結(jié)果是4,但是一旦普通成員屬性,就會多占用內(nèi)存空間,比如我加一個(gè)float類型的m_c屬性,結(jié)果是:
class Person { public: void func1(){} static void func2(){}//函數(shù)都不屬于類的對象上,只有非靜態(tài)成員變量才占用類對象內(nèi)存空間. };
這里的Person類中加了普通成員函數(shù)和靜態(tài)成員函數(shù),他們所占內(nèi)存空間的情況是什么呢,讓我們看看結(jié)果:
為什么結(jié)果和空對象一樣呢,因?yàn)槲议_頭就說了,C++中成員變量和成員函數(shù)是分開存儲的,無論是怎樣的成員函數(shù)都不會占用類對象的內(nèi)存空間。
小結(jié):函數(shù)都不屬于類的對象上,只有非靜態(tài)成員變量才占用類對象內(nèi)存空間.
從上面的內(nèi)容我們知道C++中成員變量和成員函數(shù)是分開存儲的,每一非靜態(tài)成員函數(shù)只會誕生一份函數(shù)實(shí)例,也就是說,多個(gè)同類型的對象會公用一塊代碼。
那么問題是:這一塊代碼是如何區(qū)分哪個(gè)對象調(diào)用自己呢?C++通過特殊的對象指針,this指針解決上述問題。this指針指向被調(diào)用的成員函數(shù)所屬的對象。 this指針是隱含每一個(gè)非靜態(tài)成員函數(shù)內(nèi)的一個(gè)指針,不需要定義,直接使用即可。
作用:
1、解決名稱沖突
2、返回對象指針*this
class Person { public: Person(int age) { //this 指針指向 被調(diào)用的成員函數(shù) 所屬的對象 this->age = age; } int age; };
如果我們在編寫代碼的時(shí)候,寫的屬性太多了,導(dǎo)致成員屬性和要傳入的變量名相同,就會引發(fā)不必要的bug;這時(shí)候加上一個(gè)this,就可以完美的解決這個(gè)問題,this->+屬性名,表示指向被調(diào)用的成員函數(shù)所屬的對象,那樣我們這個(gè)有參構(gòu)造函數(shù)的賦值問題就很好的解決了。
class Person { public: Person(int age) { this->age = age; } Person(const Person& p) { cout << "拷貝構(gòu)造函數(shù)調(diào)用" << endl; cout << &p << endl; } Person& PersonAddAge(Person &p); int age; }; Person& Person::PersonAddAge(Person &p)//返回引用形式地址不變,可以一直加年齡 { this->age += p.age; cout << &*this << endl; return *this; }
既然this指針指向這個(gè)對象的地址,那么*this就代表這個(gè)對象的本身,我們做一個(gè)年齡相加的成員方法來測試一下;
void test02() { Person p1(10); Person p2(10); //p1.PersonAddAge(p2).PersonAddAge(p2);//鏈?zhǔn)秸{(diào)用,返回不加&結(jié)果都是20,調(diào)用拷貝構(gòu)造; p1.PersonAddAge(p2).PersonAddAge(p2).PersonAddAge(p1).PersonAddAge(p1); cout << "p1 年齡為:" << p1.age; }
大家可以猜猜這樣輸出的p1的年齡是多少,正確答案是120,其中的“.+函數(shù)”屬于鏈?zhǔn)秸{(diào)用,可以快速調(diào)用函數(shù),非常之方便好用。之所以是120,原因是這四次調(diào)用中,第一次返回p1的年齡屬性為10+10,第二次為20+10,第三次為30+30,第四次為60+60=120。是不是看著很簡單,但有一個(gè)特別注意的事情;相信有心的伙伴已經(jīng)看到PersonAddAge函數(shù)返回值類型是Person &,返回的是類的引用,為什么不返回類的值呢?
這里注意,如果去掉“&”直接返回類的值的話,是沒法繼續(xù)鏈?zhǔn)秸{(diào)用的,因?yàn)榍懊嬷v過返回類型為類對象時(shí),這個(gè)返回的類對象會被清理掉,然后調(diào)用拷貝構(gòu)造函數(shù)在新的地址創(chuàng)建一個(gè)類對象,雖然屬性結(jié)果一樣,但是地址變了,可以輸出地址看看:
由此可見,去掉“&”四次調(diào)用產(chǎn)生了四個(gè)地址,而無論多用多少次增加年齡函數(shù),最終結(jié)果也只能是20,因?yàn)槲覀冚敵龅氖莗1的值,從第二次調(diào)用,都和p1沒關(guān)系了,地址已經(jīng)變了。
再和返回引用的做一下對比:
顯而易見,返回類引用不會調(diào)用構(gòu)造函數(shù),p1的地址不變,就能成功的累加年齡了!?。?/p>
“C++內(nèi)存空間怎么分配與this指針如何使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。