欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++對(duì)象模型和this指針詳解

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

對(duì)象模型

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

一、

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

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

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

在這里插入圖片描述

占用內(nèi)存空間為 1 的原因是:如果有其他的空對(duì)象,各自分配一個(gè)內(nèi)存空間可以讓兩者之間相互區(qū)別,而且 1 字節(jié)也很省內(nèi)存。 所以每個(gè)空對(duì)象都會(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)成員變量 屬于類的對(duì)象上
	static int m_B;// 添加 靜態(tài)成員變量 不屬于類的對(duì)象上
};
int Person::m_B = 0;

在這里插入圖片描述

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

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

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

四、

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

在這里插入圖片描述

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

五、

static voidfunc()

{}

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

this指針

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

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

特點(diǎn):

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

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

用途:

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

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

一、

  class Person
{
public:
	Person(int age)//變量
	{
		//this指針指向的是被調(diào)用成員函數(shù)的所屬對(duì)象
		//即 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)用的對(duì)象,此時(shí)為 p1。

二、

class Person
{
public:
	Person(int age)
	{
		//this指針指向的是被調(diào)用成員函數(shù)的所屬對(duì)象
		//即 p1, 所以可以解決和變量的名稱沖突
		this->age = age;
	}
	void PersonAddAge(Person &p)
	{
		this->age += p.age;
	}
	int age;
};
void test01()
{
	Person p1(18);
	cout << "p1的年齡為: " << p1.age << endl;
}
//返回對(duì)象本身用*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ù)的所屬對(duì)象
		//即 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;
}
//返回對(duì)象本身用*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(wú)限的追加。

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

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ù)(見(jiàn)拷貝構(gòu)造函數(shù)的調(diào)用時(shí)機(jī)-以值方式返回局部對(duì)象)。 所以每一次Person PersonAddAge()后,都是一個(gè)新的對(duì)象,所以最后輸出結(jié)果p2 是不變的20。

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

總結(jié)

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

相關(guān)文章

  • C++實(shí)現(xiàn)動(dòng)態(tài)煙花代碼

    C++實(shí)現(xiàn)動(dòng)態(tài)煙花代碼

    這篇文章主要介紹了利用C++實(shí)現(xiàn)的放煙花程序,用到了EGE圖形庫(kù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下
    2023-01-01
  • C++類型轉(zhuǎn)換運(yùn)算符詳解

    C++類型轉(zhuǎn)換運(yùn)算符詳解

    這篇文章主要介紹了C++類型轉(zhuǎn)換運(yùn)算符的相關(guān)資料,希望通過(guò)本文大家能夠掌握這部分內(nèi)容,需要的朋友可以參考下,希望能夠給你帶來(lái)幫助
    2021-10-10
  • 深入探究C++編程中的資源泄漏問(wèn)題以及排查方法

    深入探究C++編程中的資源泄漏問(wèn)題以及排查方法

    在C++程序開(kāi)發(fā)維護(hù)過(guò)程中,時(shí)常會(huì)遇到資源泄漏問(wèn)題,比如GDI對(duì)象泄漏、進(jìn)程線程句柄泄漏以及內(nèi)存泄漏問(wèn)題,今天我們就來(lái)深入探討一下這幾類資源泄漏以及排查這些泄露的辦法,需要的朋友可以參考下
    2023-10-10
  • C++非遞歸遍歷磁盤文件和遞歸遍歷磁盤文件的程序示例

    C++非遞歸遍歷磁盤文件和遞歸遍歷磁盤文件的程序示例

    這篇文章主要介紹了C++非遞歸遍歷磁盤文件和遞歸遍歷磁盤文件的程序示例,大家可以參考使用二種方法
    2013-11-11
  • OpenCV使用鼠標(biāo)響應(yīng)裁剪圖像

    OpenCV使用鼠標(biāo)響應(yīng)裁剪圖像

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)鼠標(biāo)響應(yīng)裁剪圖像,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Qt跨平臺(tái)窗口選擇功能的實(shí)現(xiàn)過(guò)程

    Qt跨平臺(tái)窗口選擇功能的實(shí)現(xiàn)過(guò)程

    很多時(shí)候?yàn)榱朔奖丬浖氖褂?我們需要讓編寫的界面程序顯示在最上層,這時(shí)候就需要對(duì)窗口屬性進(jìn)行調(diào)整,下面這篇文章主要給大家介紹了關(guān)于Qt跨平臺(tái)窗口選擇功能的實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下
    2022-12-12
  • C++中實(shí)現(xiàn)OpenCV圖像分割與分水嶺算法

    C++中實(shí)現(xiàn)OpenCV圖像分割與分水嶺算法

    分水嶺算法是一種常用的圖像區(qū)域分割法,本文主要介紹了OpenCV圖像分割與分水嶺算法,使用C++實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-06-06
  • C語(yǔ)言使用posix正則表達(dá)式庫(kù)的實(shí)現(xiàn)

    C語(yǔ)言使用posix正則表達(dá)式庫(kù)的實(shí)現(xiàn)

    在C語(yǔ)言中,你可以使用 POSIX 正則表達(dá)式庫(kù)(regex.h)來(lái)進(jìn)行正則表達(dá)式的模式匹配,本文主要介紹了C語(yǔ)言使用posix正則表達(dá)式庫(kù)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • C語(yǔ)言順序表的基本結(jié)構(gòu)與實(shí)現(xiàn)思路詳解

    C語(yǔ)言順序表的基本結(jié)構(gòu)與實(shí)現(xiàn)思路詳解

    順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲(chǔ)。本文將通過(guò)示例為大家講解一下順序表的基本操作,需要的可以參考一下
    2023-02-02
  • 一文詳解Qt中的對(duì)象樹(shù)機(jī)制

    一文詳解Qt中的對(duì)象樹(shù)機(jī)制

    Qt提供了對(duì)象樹(shù)機(jī)制,能夠自動(dòng)、有效的組織和管理繼承自QObject的Qt對(duì)象。這篇文章將通過(guò)一些示例為大家介紹一下Qt中對(duì)象樹(shù)機(jī)制的使用,需要的可以參考一下
    2023-03-03

最新評(píng)論