天天看點

c++中 this指針詳解

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  ,它是成員函數和成員變量之間的橋梁。