最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++超詳細(xì)講解內(nèi)存空間分配與this指針

 更新時間:2022年05月27日 09:20:30   作者:對象new不出來  
this?指針在C++類和對象中是個很方便實(shí)用的關(guān)鍵字,可以簡化對象成員屬性的調(diào)用,使代碼表達(dá)的含義更加準(zhǔn)確;在之前的學(xué)習(xí)中我們都可以判斷變量所占內(nèi)存空間大小,那么我們創(chuàng)建的類對象所占的內(nèi)存空間怎么計(jì)算呢?想知道this的妙用和類對象占用的內(nèi)存空間就來跟我學(xué)習(xí)吧

成員屬性和函數(shù)的存儲

在C++中成員變量和成員函數(shù)是分開存儲的;

空對象

class Person {};

這里我直接創(chuàng)建一個空的類,并創(chuàng)建一個空的類對象(Person p),利用sizeof關(guān)鍵字輸出p所占內(nèi)存空間,sizeof(p);結(jié)果是p=1;

注意:空對象占用內(nèi)存空間為:

1、C++編譯器會給每個空對象分配一個字節(jié)空間,是為了區(qū)分空對象占內(nèi)存的位置

2、每個空對象也應(yīng)該有一個獨(dú)一無二的內(nèi)存地址

成員屬性的存儲

class Person
{
public:
	int m_A;
    static int m_B;
};
int Person::m_B = 100;

首先創(chuàng)建一個簡單的Person類,僅僅包含普通成員屬性m_A和靜態(tài)成員變量m_B;然后直接利用sizeof關(guān)鍵字輸出p所占內(nèi)存空間:sizeof(p)

這里的結(jié)果是4,而不是8,這是因?yàn)殪o態(tài)成員屬性不屬于類的對象上,無論再加幾個靜態(tài)成員屬性,都不會改變結(jié)果是4,但是一旦普通成員屬性,就會多占用內(nèi)存空間,比如我加一個float類型的m_c屬性,結(jié)果是:

成員函數(shù)的存儲

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)存空間.

this指針的概念

從上面的內(nèi)容我們知道C++中成員變量和成員函數(shù)是分開存儲的,每一非靜態(tài)成員函數(shù)只會誕生一份函數(shù)實(shí)例,也就是說,多個同類型的對象會公用一塊代碼。

那么問題是:這一塊代碼是如何區(qū)分哪個對象調(diào)用自己呢?C++通過特殊的對象指針,this指針解決上述問題。this指針指向被調(diào)用的成員函數(shù)所屬的對象。 this指針是隱含每一個非靜態(tài)成員函數(shù)內(nèi)的一個指針,不需要定義,直接使用即可。

作用:

1、解決名稱沖突

2、返回對象指針*this

解決名稱沖突

class Person
{
public:
	Person(int age)
	{
		//this 指針指向 被調(diào)用的成員函數(shù) 所屬的對象
		this->age = age;
	}
	int age;
};

如果我們在編寫代碼的時候,寫的屬性太多了,導(dǎo)致成員屬性和要傳入的變量名相同,就會引發(fā)不必要的bug;這時候加上一個this,就可以完美的解決這個問題,this->+屬性名,表示指向被調(diào)用的成員函數(shù)所屬的對象,那樣我們這個有參構(gòu)造函數(shù)的賦值問題就很好的解決了。

返回對象指針*this

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指針指向這個對象的地址,那么*this就代表這個對象的本身,我們做一個年齡相加的成員方法來測試一下;

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。是不是看著很簡單,但有一個特別注意的事情;相信有心的伙伴已經(jīng)看到PersonAddAge函數(shù)返回值類型是Person &,返回的是類的引用,為什么不返回類的值呢?

這里注意,如果去掉“&”直接返回類的值的話,是沒法繼續(xù)鏈?zhǔn)秸{(diào)用的,因?yàn)榍懊嬷v過返回類型為類對象時,這個返回的類對象會被清理掉,然后調(diào)用拷貝構(gòu)造函數(shù)在新的地址創(chuàng)建一個類對象,雖然屬性結(jié)果一樣,但是地址變了,可以輸出地址看看:

由此可見,去掉“&”四次調(diào)用產(chǎn)生了四個地址,而無論多用多少次增加年齡函數(shù),最終結(jié)果也只能是20,因?yàn)槲覀冚敵龅氖莗1的值,從第二次調(diào)用,都和p1沒關(guān)系了,地址已經(jīng)變了。

再和返回引用的做一下對比:

顯而易見,返回類引用不會調(diào)用構(gòu)造函數(shù),p1的地址不變,就能成功的累加年齡了?。?!

總結(jié)

學(xué)習(xí)了這一節(jié)我們一定要知道C++成員屬性和成員函數(shù)是分開存儲的,以及this指針的妙用;再使用返回對象指針*this的時候,如果想繼續(xù)對此對象的屬性進(jìn)行修改,一定要加上“&”引用符,如果單純?yōu)榱孙@示的話,可以不加。好了,今天的分享結(jié)束了,我們“明天見”。

到此這篇關(guān)于C++超詳細(xì)講解內(nèi)存空間分配與this指針的文章就介紹到這了,更多相關(guān)C++內(nèi)存空間分配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于C語言實(shí)現(xiàn)推箱子游戲

    基于C語言實(shí)現(xiàn)推箱子游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C語言實(shí)現(xiàn)自動分配地址的示例

    C語言實(shí)現(xiàn)自動分配地址的示例

    本文介紹了兩種自動分配地址的方法,包括通過宏定義實(shí)現(xiàn)地址分配和將EE地址作為一個結(jié)構(gòu)體,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • C++生成不重復(fù)的隨機(jī)整數(shù)

    C++生成不重復(fù)的隨機(jī)整數(shù)

    這篇文章主要為大家詳細(xì)介紹了C++生成不重復(fù)的隨機(jī)整數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C語言 詳細(xì)講解邏輯運(yùn)算符的使用

    C語言 詳細(xì)講解邏輯運(yùn)算符的使用

    在C語言中,邏輯運(yùn)算符有&&、||、!;&&表示“與”的意思,需要兩端的表達(dá)式的值都為true,該式的值才為true。||表示“或”的意思,兩端的表達(dá)式的值只要有一端為true,該式的值就為true。!表示“非”的意思,將該式的真值換成相反的真值,即false和true互換
    2022-04-04
  • C語言實(shí)現(xiàn)文件內(nèi)容按行隨機(jī)排列的算法示例

    C語言實(shí)現(xiàn)文件內(nèi)容按行隨機(jī)排列的算法示例

    這篇文章主要介紹了C語言實(shí)現(xiàn)文件內(nèi)容按行隨機(jī)排列的算法,涉及C語言字符串、數(shù)組遍歷與隨機(jī)數(shù)相關(guān)算法實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • C語言實(shí)現(xiàn)ATM自動取款機(jī)系統(tǒng)的示例代碼

    C語言實(shí)現(xiàn)ATM自動取款機(jī)系統(tǒng)的示例代碼

    ATM自動取款機(jī)系統(tǒng)是銀行業(yè)務(wù)流程中十分重要且必備的環(huán)節(jié)之一,在銀行業(yè)務(wù)流程中起著承上啟下的作用。本文將用C語言實(shí)現(xiàn)一個簡單的ATM自動取款機(jī)系統(tǒng),需要的可以參考一下
    2022-08-08
  • ubuntu 下編譯C++代碼出現(xiàn)的問題解決

    ubuntu 下編譯C++代碼出現(xiàn)的問題解決

    這篇文章主要介紹了ubuntu 下編譯C++代碼出現(xiàn)的問題解決的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • C語言編程C++自定義個性化類型

    C語言編程C++自定義個性化類型

    這篇文章主要介紹了C語言編程中如何來自定義C++個性化類型,文中附含詳細(xì)的示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)鄰接表

    C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)鄰接表

    這篇文章主要為大家詳細(xì)介紹了C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)鄰接表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語言中的putchar函數(shù)示例

    C語言中的putchar函數(shù)示例

    putchar函數(shù)函數(shù)幾乎是在整個C語言中最沒有知名度的,它常常被程序員冷漠地對待,這篇文章主要介紹了C語言中的putchar函數(shù),需要的朋友可以參考下
    2022-12-12

最新評論

永泰县| 阿巴嘎旗| 恩施市| 钦州市| 建宁县| 克什克腾旗| 叶城县| 阳山县| 中卫市| 开鲁县| 云霄县| 新泰市| 三原县| 辛集市| 保定市| 德化县| 油尖旺区| 富顺县| 金阳县| 永德县| 韩城市| 德江县| 平远县| 贵溪市| 佳木斯市| 老河口市| 鱼台县| 宝应县| 克东县| 克山县| 麻栗坡县| 资中县| 肃宁县| 东兰县| 芜湖市| 阿拉善右旗| 兴宁市| 银川市| 博客| 东阿县| 高邮市|