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

C++對象模型和this指針詳解

 更新時(shí)間:2021年10月29日 09:45:22   作者:漸迷人眼-  
這篇文章主要介紹了詳解C++對象模型和this指針,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下,希望能夠給你帶來幫助

對象模型

成員變量和成員函數(shù)分開存儲(chǔ)

一、

只有非靜態(tài)成員變量才屬于類的對象上

空對象占用字節(jié)為1

 class Person
{
};
void test01()
{
	Person p;
	cout << "size of = " << sizeof(p) << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

在這里插入圖片描述

占用內(nèi)存空間為 1 的原因是:如果有其他的空對象,各自分配一個(gè)內(nèi)存空間可以讓兩者之間相互區(qū)別,而且 1 字節(jié)也很省內(nèi)存。 所以每個(gè)空對象都會(huì)有一個(gè)自己的內(nèi)存地址。

二、

class Person
{
	int m_A;//改為有內(nèi)容
};
void test02()
{
	Person p;
	cout << "size of = " << sizeof(p) << endl;
}
int main()
{
	test02();
	system("pause");
	return 0;
}

在這里插入圖片描述

因?yàn)?int 類型 ,不把之前的空類型考慮進(jìn)去。

三、

將Person類改為

class Person
{
	int m_A;// 非靜態(tài)成員變量 屬于類的對象上
	static int m_B;// 添加 靜態(tài)成員變量 不屬于類的對象上
};
int Person::m_B = 0;

在這里插入圖片描述

非靜態(tài)成員變量 屬于類的對象上

靜態(tài)成員變量,不屬于類對象上

所以不考慮在內(nèi)

四、

class Person
{
	int m_A;// 非靜態(tài)成員變量 屬于類的對象上
	static int m_B;// 添加 靜態(tài)成員變量 不屬于類的對象上
	void func()  //非靜態(tài)成員函數(shù)
	{
	}
};
int Person::m_B = 0;

在這里插入圖片描述

所以成員變量和成員函數(shù)是分開存儲(chǔ)的,非靜態(tài)成員函數(shù)不屬于類對象上

五、

static voidfunc()

{}

靜態(tài)成員函數(shù)也不會(huì)增加 不屬于類對象上

this指針

用于區(qū)分類中多個(gè)對象調(diào)用函數(shù)時(shí),分別都是哪個(gè)函數(shù)在調(diào)用自己。

this 指針指向被調(diào)用成員函數(shù)所屬的對象

特點(diǎn):

1. this指針是隱含每一個(gè)非靜態(tài)成員函數(shù)內(nèi)的一種指針

2.this 指針不需要定義,直接使用即可。

用途:

1.當(dāng)形參和成員變量同名時(shí),可用this指針來區(qū)分

2.在類的非靜態(tài)成員變量中返回對象本身,可使用return *this

一、

  class Person
{
public:
	Person(int age)//變量
	{
		//this指針指向的是被調(diào)用成員函數(shù)的所屬對象
		//即 p1, 所以可以解決和變量的名稱沖突
		this->age = age;//前一個(gè)為成員變量,后一個(gè)age為形參
	}
	int age;
};
void test01()
{
	Person p1(18);
	cout << "p1的年齡為: " << p1.age << endl;
}
main()
{
	test01();
	system("pause");
	return 0;
}

如果不加 this 都會(huì)默認(rèn)為形參 age ,從而報(bào)錯(cuò)。

this 指向被調(diào)用的對象,此時(shí)為 p1。

二、

class Person
{
public:
	Person(int age)
	{
		//this指針指向的是被調(diào)用成員函數(shù)的所屬對象
		//即 p1, 所以可以解決和變量的名稱沖突
		this->age = age;
	}
	void PersonAddAge(Person &p)
	{
		this->age += p.age;
	}
	int age;
};
void test01()
{
	Person p1(18);
	cout << "p1的年齡為: " << p1.age << endl;
}
//返回對象本身用*this 
void test02()
{
	Person p1(10);
	Person p2(10);
	p2.PersonAddAge(p1);
	cout << "p2年齡:" << p2.age << endl;
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

此時(shí)p2為 20 ,若要多次相加需要改動(dòng)為

class Person
{
public:
	Person(int age)
	{
		//this指針指向的是被調(diào)用成員函數(shù)的所屬對象
		//即 p1, 所以可以解決和變量的名稱沖突
		this->age = age;
	}
	Person& PersonAddAge(Person &p)//此處void 改為Peroson是因?yàn)榉祷刂等绻莗2的話,就可以將p2.PersonAddAge(p1) 看作p2,然后繼續(xù)調(diào)用之后的PersonAddAge(p1)
	//此處的Person &p是以 引用的方式傳入
	//此處的Person& 是以引用的方式返回
	{
		this->age += p.age;
		// this是指向p2的指針,而*this就是p2本體
		return* this;
	}
	int age;
};
void test01()
{
	Person p1(18);
	cout << "p1的年齡為: " << p1.age << endl;
}
//返回對象本身用*this 
void test02()
{
	Person p1(10);
	Person p2(10);
	p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
	cout << "p2年齡:" << p2.age << endl;
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

在這里插入圖片描述

鏈?zhǔn)骄幊趟枷耄嚎梢酝鬅o限的追加。

但如果函數(shù),不使用引用方法,返回的是一個(gè)值,就會(huì)創(chuàng)建新的對象

Person PersonAddAge(Person &p)//不使用引用方法
	{
		this->age += p.age;
		// this是指向p2的指針,而*this就是p2本體
		return* this;
	}
	int age;
};

在第一次調(diào)用Person PersonAddAge()后 ,p2加了10, 但在這之后返回的并不是本體了,而是根據(jù)本體創(chuàng)建的一個(gè)新的數(shù)據(jù)。Person 和 *this 是不一樣的數(shù)據(jù)(見拷貝構(gòu)造函數(shù)的調(diào)用時(shí)機(jī)-以值方式返回局部對象)。 所以每一次Person PersonAddAge()后,都是一個(gè)新的對象,所以最后輸出結(jié)果p2 是不變的20。

疑問:至于為什么不是p2 為 10 。 以值方式返回局部對象會(huì)調(diào)用拷貝構(gòu)造函數(shù)。對p2進(jìn)行一次PersonAddAge操作后,將p2的結(jié)果拷貝為p2' 。所以p2還是經(jīng)過了一次加年齡的操作的 。對p2進(jìn)行一次PersonAddAge操作后,將p2的結(jié)果拷貝為p2'

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++用winapi?socket實(shí)現(xiàn)局域網(wǎng)語音通話功能

    C++用winapi?socket實(shí)現(xiàn)局域網(wǎng)語音通話功能

    這篇文章主要介紹了socket實(shí)現(xiàn)局域網(wǎng)語音通話?c++?winapi,功能介紹支持錄音設(shè)備查找以及播放設(shè)備查找,支持局域網(wǎng)語音通話,通話包含語音來電提醒和掛斷電話的提示信息,還能實(shí)時(shí)的獲取在線用戶的數(shù)量以及對應(yīng)的id,需要的的朋友一起看看
    2022-06-06
  • Qt?關(guān)于容器的遍歷迭代器的使用問題小結(jié)

    Qt?關(guān)于容器的遍歷迭代器的使用問題小結(jié)

    Qt是一個(gè)跨平臺(tái)的 C++ 開發(fā)庫,主要用來開發(fā)圖形用戶界面程序,當(dāng)然也可以開發(fā)不帶界面的命令行程序,本文重點(diǎn)給大家介紹Qt?關(guān)于容器的遍歷迭代器的使用問題小結(jié),感興趣的朋友一起看看吧
    2022-03-03
  • 深入了解C++優(yōu)先隊(duì)列(priority_queue)的使用方法

    深入了解C++優(yōu)先隊(duì)列(priority_queue)的使用方法

    在計(jì)算機(jī)科學(xué)中,優(yōu)先隊(duì)列是一種抽象數(shù)據(jù)類型,它與隊(duì)列相似,但是每個(gè)元素都有一個(gè)相關(guān)的優(yōu)先級。C++中的優(yōu)先隊(duì)列是一個(gè)容器適配器(container adapter),它提供了一種在元素之間維護(hù)優(yōu)先級的方法。本文帶你深入了解C++優(yōu)先隊(duì)列的使用方法,需要的可以參考下
    2023-05-05
  • C++取得當(dāng)前時(shí)間的方法

    C++取得當(dāng)前時(shí)間的方法

    這篇文章主要介紹了C++取得當(dāng)前時(shí)間的方法,實(shí)例展示了通過系統(tǒng)函數(shù)獲取當(dāng)前時(shí)間的實(shí)現(xiàn)方法,非常簡單易懂,需要的朋友可以參考下
    2014-10-10
  • C++存儲(chǔ)持續(xù)性生命周期原理解析

    C++存儲(chǔ)持續(xù)性生命周期原理解析

    這篇文章主要為大家介紹了C++存儲(chǔ)持續(xù)性生命周期原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • C++學(xué)習(xí)筆記之淺談異常處理

    C++學(xué)習(xí)筆記之淺談異常處理

    C++ 提供了異常機(jī)制,讓我們能夠捕獲運(yùn)行時(shí)錯(cuò)誤,本文就詳細(xì)的介紹了C++異常處理入門,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • c++ bitset詳解

    c++ bitset詳解

    這篇文章主要介紹了C++ bitset用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 用C語言遞歸實(shí)現(xiàn)火車調(diào)度算法詳解

    用C語言遞歸實(shí)現(xiàn)火車調(diào)度算法詳解

    本文主要介紹了用C語言遞歸實(shí)現(xiàn)火車調(diào)度算法詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++ EasyX學(xué)習(xí)之鼠標(biāo)操作詳解

    C++ EasyX學(xué)習(xí)之鼠標(biāo)操作詳解

    EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將為大家詳細(xì)講講EasyX的鼠標(biāo)操作,需要的可以參考一下
    2022-07-07
  • C++大數(shù)模板(推薦)

    C++大數(shù)模板(推薦)

    本篇文章是對C++大數(shù)模板的程序代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

东海县| 芜湖县| 瑞昌市| 红桥区| 陆良县| 河南省| 灯塔市| 武宁县| 修文县| 绍兴县| 花垣县| 离岛区| 驻马店市| 商河县| 任丘市| 团风县| 新竹县| 揭阳市| 延安市| 新巴尔虎左旗| 阿鲁科尔沁旗| 基隆市| 贵阳市| 临澧县| 勐海县| 岑巩县| 渝中区| 皋兰县| 东乌珠穆沁旗| 博兴县| 怀远县| 木兰县| 秭归县| 桂林市| 阿拉善右旗| 舞阳县| 贵定县| 饶平县| 岱山县| 杨浦区| 房产|