this 是 c++中的一個關鍵字,也是一個常量指針,指向目前對象,也就是目前對象的首位址。通過this指針,可以通路目前對象的成員變量和成員函數。
【特性】
1. this指針的類型是 類類型* const
2. this指針并不是對象本身的一部分,不會影響sizeof的結果
3. this的作用域在類成員函數的内部
4. this指針是類成員函數的第一個預設隐含參數,編譯器自動維護傳遞
5. 隻有在類的非靜态成員函數中才可以使用this指針
所謂的目前對象,就是正在使用的對象,例如stu.print(); stu 就是目前對象,系統正在通路stu的成員函數print()
假設this指向stu對象 那麼 下面的pStu 的值就和this的值相同
Student stu;
Student *const pStu = &stu;
下面示範一個完整的例子
#include <iostream>
using namespace std;
class Student
{
public:
void setName(char *);
void setAge(int );
void print();
private:
char *name;
int age;
double score;
};
void Student::setName(char* name)
{
this->name = name;
}
void Student::setAge(int age)
{
this->age = age;
}
void Student::print()
{
cout << this->name << ":" << this->age << "歲" <<endl;
}
int main()
{
Student stu1;
stu1.setName("小王");
stu1.setAge(18);
stu1.print();
Student stu2;
stu2.setName("李元霸");
stu2.setAge(16);
stu2.print();
return 0;
}
輸出結果:
小王:18歲
李元霸:16歲
對象和普通的變量類似,每個對象都占用若幹位元組的記憶體,用來儲存成員變量的值,
不同對象占用的記憶體互不重疊。
上面的例子中建立stu1時,this指針就指向了stu1所在記憶體塊的首位元組,建立stu2時,this指針就指向了stu所在記憶體塊的首位元組...
現在添加下面的函數 用來輸出this的值,驗證this的值與 對象的位址是否相同:
void Student::printAddr()
{
cout << this << endl;
}
接着在main函數中輸出建立對象并調用函數:
int main()
{
Student stu1;
Student *pStu1 = &stu1;
stu1.printAddr();
cout << pStu1 << endl;
Student stu2;
Student *pStu2 = &stu2;
stu2.printAddr();
cout << pStu2 << endl;
return 0;
}
輸出結果:
0030FBEC
0030FBEC
0030FBC8
0030FBC8
輸出結果顯示了this确實指向了目前對象的首位址,而且對于不同的對象,this的值也不一樣。
切記:
~~this 是常量指針,它的值不能被修改
~~this 隻能在成員函數内部使用
~~隻有對象被建立後this才有意義,是以不能再static成員函數中使用
實際上,this指針是作為函數的參數隐式傳遞的,它并不出現在參數清單中,調用成員函數時,系統(編譯器)自動擷取目前對象的位址,并賦給this,完成參數的傳遞。
this作為隐式參數,本質上是成員函數的局部變量,不占用對象的記憶體,隻有在發生成員函數調用時才會給this指派,函數調用結束,this被銷毀。
在《C++函數編譯原理和成員函數的實作》講到,成員函數最終被編譯成與對象無關的普通函數,除了成員變量,會丢失所有資訊,是以在編譯時要在成員函數中添加一個額外的參數,把目前對象的首位址傳入,以此來關聯成員函數和成員變量。
這個額外的參數也就是this ,它是成員函數和成員變量之間的橋梁。