C++中的this指標究竟是什麼?
阿新 • • 發佈:2019-01-09
先來看一個簡單的程式:
#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;
}
稍微改動上述程式,得到:
那怎麼辦呢?用this指標吧:#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; }
#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; }
this指標是指向物件的,而靜態成員函式並不屬於某個物件,因此,在靜態成員函式中,並沒有this指標,這一點值得注意。#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; }