中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解C++對象模型和this指針

發布時間:2021-10-29 11:14:45 來源:億速云 閱讀:135 作者:iii 欄目:開發技術

本篇內容主要講解“如何理解C++對象模型和this指針”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何理解C++對象模型和this指針”吧!

對象模型

成員變量和成員函數分開存儲

一、

只有非靜態成員變量才屬于類的對象上

空對象占用字節為1

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

如何理解C++對象模型和this指針

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

二、

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

如何理解C++對象模型和this指針

因為 int 類型 ,不把之前的空類型考慮進去。

三、

將Person類改為

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

如何理解C++對象模型和this指針

非靜態成員變量 屬于類的對象上

靜態成員變量,不屬于類對象上

所以不考慮在內

四、

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

如何理解C++對象模型和this指針

所以成員變量和成員函數是分開存儲的,非靜態成員函數不屬于類對象上

五、

static voidfunc()

{}

靜態成員函數也不會增加 不屬于類對象上

this指針

用于區分類中多個對象調用函數時,分別都是哪個函數在調用自己。

this 指針指向被調用成員函數所屬的對象

特點:

1. this指針是隱含每一個非靜態成員函數內的一種指針

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

用途:

1.當形參和成員變量同名時,可用this指針來區分

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

一、

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

如果不加 this 都會默認為形參 age ,從而報錯。

this 指向被調用的對象,此時為 p1。

二、

class Person
{
public:
	Person(int age)
	{
		//this指針指向的是被調用成員函數的所屬對象
		//即 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;
}

此時p2為 20 ,若要多次相加需要改動為

class Person
{
public:
	Person(int age)
	{
		//this指針指向的是被調用成員函數的所屬對象
		//即 p1, 所以可以解決和變量的名稱沖突
		this->age = age;
	}
	Person& PersonAddAge(Person &p)//此處void 改為Peroson是因為返回值如果是p2的話,就可以將p2.PersonAddAge(p1) 看作p2,然后繼續調用之后的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;
}

如何理解C++對象模型和this指針

鏈式編程思想:可以往后無限的追加。

但如果函數,不使用引用方法,返回的是一個值,就會創建新的對象

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

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

疑問:至于為什么不是p2 為 10 。 以值方式返回局部對象會調用拷貝構造函數。對p2進行一次PersonAddAge操作后,將p2的結果拷貝為p2' 。所以p2還是經過了一次加年齡的操作的 。對p2進行一次PersonAddAge操作后,將p2的結果拷貝為p2'

到此,相信大家對“如何理解C++對象模型和this指針”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

乌苏市| 蒙城县| 柯坪县| 平陆县| 高平市| 陕西省| 永福县| 徐汇区| 花莲市| 晋江市| 宾阳县| 土默特左旗| 孝昌县| 花垣县| 德江县| 佛坪县| 谷城县| 蒲江县| 平邑县| 申扎县| 布拖县| 商洛市| 奇台县| 旅游| 文安县| 贺兰县| 华池县| 和龙市| 连云港市| 竹山县| 侯马市| 定襄县| 东阿县| 梅河口市| 澎湖县| 崇明县| 山东| 嵊泗县| 黎川县| 横山县| 布拖县|