C++ this指針詳解

                 C++this指針操做ios

在這裏總結一下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只能在成員函數中使用。全局函數,靜態函數都不能使用this。實際上,成員函數默認第一個參數爲T* const register this。編碼

爲何this指針不能再靜態函數中使用?spa

  你們能夠這樣理解,靜態函數如同靜態變量同樣,他不屬於具體的哪個對象,靜態函數表示了整個類範圍意義上的信息,而this指針卻實實在在的對應一個對象,因此this指針固然不能被靜態函數使用了,同理,全局函數也同樣,我是這樣理解的,不知道你們怎樣理解,你們能夠評論交流下。指針

 

(1):this指針是何時建立的?code

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,有新東西再完善吧奮鬥奮鬥

相關文章
相關標籤/搜索