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

。