1. 程式人生 > >C++中的this指標究竟是什麼?

C++中的this指標究竟是什麼?

      先來看一個簡單的程式:

#include <iostream>
using namespace std;

class Human
{
private:
	int age;

public:
	void setAge(int a)
	{
		age = a;
	}

	int getAge()
	{
		return age;
	}
};

int main()
{
	Human h;
	h.setAge(10);
	cout << h.getAge() << endl; // 10

	return 0;
}
     稍微改動上述程式,得到:
#include <iostream>
using namespace std;

class Human
{
private:
	int age;

public:
	void setAge(int age)
	{
		age = age; // 真正的欄位age被形參age遮蔽
	}

	int getAge()
	{
		return age;
	}
};

int main()
{
	Human h;
	h.setAge(10);
	cout << h.getAge() << endl; // -858993460

	return 0;
}
      那怎麼辦呢?用this指標吧:
#include <iostream>
using namespace std;

class Human
{
private:
	int age;

public:
	void setAge(int age)
	{
		this->age = age;
	}

	int getAge()
	{
		return age;
	}
};

int main()
{
	Human h;
	h.setAge(10);
	cout << h.getAge() << endl; // 10

	return 0;
}
     實際上,在編譯器看來,成員函式setAge是這樣的:void setAge(Human *const this, int age); 也就是說this指標是編譯器預設的成員函式的一個引數,在呼叫h.setAge(10);時,在編譯看來,實際上是呼叫了Human::setAge(&h, 10); 這樣,就實現了物件與其對應的屬性或方法的繫結。下面這個程式之所以能區分不同不同物件,也完全是拜this指標所賜。
#include <iostream>
using namespace std;

class Human
{
private:
	int age;

public:
	void setAge(int a)
	{
		age = a;
	}

	int getAge()
	{
		return age;
	}
};

int main()
{
	Human h1, h2;
	h1.setAge(10);
	cout << h1.getAge() << endl; // 10

	h2.setAge(20);
	cout << h2.getAge() << endl; // 20

	return 0;
}
     接著來欣賞如下程式:
#include <iostream>
using namespace std;

class Human
{
private:
	int age;

public:
	void setAge(int a)
	{
		cout << this << endl;  // 0012FF7C
		age = a;
		cout << age << endl;   // 10
	}

	int getAge()
	{
		return age;
	}
};

int main()
{
	Human h;
	cout << &h << endl;         // 0012FF7C
	h.setAge(10);
	cout << h.getAge() << endl; // 10

	return 0;
}
     this指標是指向物件的,而靜態成員函式並不屬於某個物件,因此,在靜態成員函式中,並沒有this指標,這一點值得注意。