1. 程式人生 > >【C++】類和物件(3)—>> this指標

【C++】類和物件(3)—>> this指標

一、this指標的引入

我們在現實中,定義一個類都是根據一個需求來定義的。所以先來看一個常用的日期類 Date 。

class Date
{
public:
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
        //等價於cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
	}
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
			}
private://封裝起來不允許隨便修改
	int _year;//年   //用_區分成員變數和引數
	int _month;//月
	int _day;//日
};

int main()
{
	Date d1;
	d1.Init(2018, 11, 11);//用Init函式初始化來間接修改值
	d1.Print();

	Date d2;
	d2.Init(2019, 2, 4);
	d2.Print();

	//d2 - d1;//不能執行,因為這個類是我們自己定的規則,所以編譯器不懂這個“-”的真正意義
	system("pause");
	return 0;
}

對於上述類,有這樣的一個問題:

Date類中有 Init 與 Print 兩個成員函式,函式體中沒有關於不同物件的區分,那當s1呼叫 Init 函式
時,該函式是如何知道應該設定s1物件,而不是設定s2物件呢?


 

C++中通過引入this指標解決該問題,即:C++編譯器給每個“成員函式“增加了一個隱藏的指標引數,讓該指
針指向當前物件(函式執行時呼叫該函式的物件),在函式體中所有成員變數的操作,都是通過該指標去訪
問。只不過所有的操作對使用者是透明的,即使用者不需要來傳遞,編譯器自動完成。
 

二、this指標的特徵

1. this指標的型別:類的型別* const

2. 只能在“成員函式”的內部使用

3. this指標本質上其實是一個成員函式的形參,是物件呼叫成員函式時,將物件地址作為實參傳遞給this形參。所以物件中不儲存this指標

4. this指標是成員函式第一個隱含的指標形參,一般情況由編譯器通過ecx暫存器自動傳遞,不需要使用者傳遞

 

Q1:那麼 this指標 存在哪裡?

this指標是一個形參,所以它存在棧上。

Q2:this指標可以為空嗎?

class Date
{
public:
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	void Show()
	{
		cout << "Show()" << endl;
	}
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private://封裝起來不允許隨便修改
	int _year;//年   //用_區分成員變數和引數
	int _month;//月
	int _day;//日
};

int main()
{
	Date* p = NULL;
	p->Print();
	p->Show();
	system("pause");
	return 0;
}

 

在這裡,我們可以看到,它是可以編譯通過的,但是執行不了,實際上已經崩潰了。作為一個空指標,只要不被解引用就不會出問題。

所以說this指標可以為空,當我們在呼叫函式的時候,如果函式內部並不需要使用到this,也就是不需要通過this指向當前物件並對其進行操作時才可以為空(當我們在其中什麼都不放或者在裡面隨便列印一個字串),如果呼叫的函式需要指向當前物件,並進行操作,則會發生錯誤(空指標引用)就跟C中一樣不能進行空指標的引用。

空指標引用  ---->  https://blog.csdn.net/Miss_Monster/article/details/86170625