1. 程式人生 > >C++ this指標詳解

C++ this指標詳解

                 C++this指標操作

在這裡總結一下this 指標的相關知識點。

  首先,我們都知道類的成員函式可以訪問類的資料(限定符只是限定於類外的一些操作,類內的一切對於成員函式來說都是透明的),那麼成員函式如何知道哪個物件的資料成員要被操作呢,原因在於每個物件都擁有一個指標:this指標,通過this指標來訪問自己的地址。注:this指標並不是物件的一部分,this指標所佔的記憶體大小是不會反應在sizeof操作符上的。this指標的型別取決於使用this指標的成員函式型別以及物件型別,(1)假如this指標所在類的型別是Stu_Info_Mange型別,(下面的測試用例中的類的型別,借來用用),並且如果成員函式是非常量的,則this的型別是:Stu_Info_Mange * const 型別

,(2)既一個指向非const Stu_Info_Mange物件的常量(const)指標,假若成員函式是常量型別,則this指標的型別是一個指向constStu_Info_Mange物件的常量(const)指標。有點繞吧,仔細理解。

二:this指標常用概念

this只能在成員函式中使用。全域性函式,靜態函式都不能使用this。實際上,成員函式預設第一個引數為T* const register this。

為什麼this指標不能再靜態函式中使用?

  大家可以這樣理解,靜態函式如同靜態變數一樣,他不屬於具體的哪一個物件,靜態函式表示了整個類範圍意義上的資訊,而this指標卻實實在在的對應一個物件,所以this指標當然不能被靜態函式使用了,同理,全域性函式也一樣,我是這樣理解的,不知道大家怎樣理解,大家可以評論交流下。

(1):this指標是什麼時候建立的?

this在成員函式的開始執行前構造的,在成員的執行結束後清除

(2)this指標如何傳遞給類中函式的?繫結?還是在函式引數的首引數就是this指標.那麼this指標又是如何找到類例項後函式的?

  this是通過函式引數的首引數來傳遞的。this指標是在呼叫之前生成的。類例項後的函式,沒有這個說法。類在例項化時,只分配類中的變數空間,並沒有為函式分配空間。自從類的函式定義完成後,它就在那兒,不會跑的。

(3)this指標只有在成員函式中才有定義。因此,你獲得一個物件後,也不能通過物件使用this指標。所以,我們也無法知道一個物件的this指標的位置(只有在成員函式裡才有this指標的位置)。當然,在成員函式裡,你是可以知道this指標的位置的(可以&this獲得),也可以直接使用的。

三:this指標的使用:

一種情況就是,在類的非靜態成員函式中返回類物件本身的時候,我們可以使用圓點運算子(*this).,箭頭運算子this->,另外,我們也可以返回關於*this的引用,這樣我們可以像輸入輸出流那樣進行“級聯”操作。

文字理解起來很枯燥,不如例子直接,我們下面就舉幾個實用的例子來分析。

  我們建立一個學生資訊類,具體東西註釋很清晰了,直接上程式碼、

#include<iostream>
#include<string>
using namespace std;
class Stu_Info_Mange
{
	int sno;
	string sname;
	int age;
	int grade;
public:
	Stu_Info_Mange(int s=0,string n="",int a=0,int g=0)
	{
		sno=s;
		sname=n;
		age=a;
		grade=g;
	}
	void Setsname(int sn)   //使用this指標進行賦值
	{
		this->sname=sn;
	}
	int  Setage(int a)
	{
		this->age=a;
		return (*this).age; //使用this指標返回該物件的年齡
	}
	void print()
	{
		cout<<"the sname is "<<this->sname<<endl;  //顯式this指標通過箭頭操作符訪問
		cout<<"the sno   is "<<sno<<endl;//隱式使用this指標列印
		cout<<"the age   is "<<(*this).age<<endl;//顯式使用this指標通過遠點操作符
		cout<<"the grade is "<<this->grade<<endl<<endl;
	}

};
int main()
{
	Stu_Info_Mange sim1(761,"張三",19,3);

	sim1.print();      //輸出資訊

	sim1.Setage(12);  //使用this指標修改年齡


	sim1.print();     //再次輸出
	return 0;
}


     以上的例子中,我們要設定一個學生的資訊,需要對每一個相關變數所屬的成員函式進行呼叫(名字呼叫設定名字的成員函式。。。),我們還可以使用this的另外一個功能,讓他實現級聯,方便我們呼叫,對此,我們對上述程式碼進行修改,如下:

#include<iostream>
#include<string>
using namespace std;
class Stu_Info_Mange
{
	int sno;
	string sname;
	int age;
	int grade;
public:
	Stu_Info_Mange(int s=0,string n="",int a=0,int g=0)
	{
		sno=s;
		sname=n;
		age=a;
		grade=g;
	}
	<span style="color:#ff0000;">Stu_Info_Mange &</span> Setsname(string s)   //<span style="color:#ff0000;">所有的相關函式,都返回該物件的引用,這樣就可以實現級聯,方便編碼</span>
	{
		this->sname=s;
		<span style="color:#ff0000;">return (*this);</span>
	}
	<span style="color:#ff0000;">Stu_Info_Mange &</span> Setsno(int sno)
	{
		this->sno=sno;
		<span style="color:#ff0000;">return *this</span>;
	}
	<span style="color:#ff0000;">Stu_Info_Mange &Setgrade(</span>int grade)
	{
		this->grade=grade;
		<span style="color:#ff0000;">return *this;</span>
	}
	<span style="color:#ff0000;">Stu_Info_Mange &</span>Setage(int age)
	{
		this->age=age;
		<span style="color:#ff0000;">return *this;</span>
	}
	void print()
	{
		cout<<"the sname is "<<this->sname<<endl;
		cout<<"the sno   is "<<this->sno<<endl;
		cout<<"the age   is "<<this->age<<endl;
		cout<<"the grade is "<<this->grade<<endl<<endl;

	}
};
int main()
{
	Stu_Info_Mange sim;//  使用預設引數
	<span style="color:#ff0000;">sim.Setsname("張三").Setsno(457).Setgrade(2012).Setage(20);  //級聯</span>
	//使用this指標使串聯的函式呼叫成為可能

	sim.print();
	 
	return 0;

}

   

  關於this指標的一些概念就總結到這裡吧,現在抓緊攻讀C++primer,有新東西再完善吧奮鬥奮鬥