this是一個const指針,存的是當前對象的地址,指向當前對象,經過this指針能夠訪問類中的全部成員。c++
當前對象是指正在使用的對象,好比a.print()
,a
就是當前對象。函數
關於thisthis
this只能在成員函數中使用,全局函數,靜態函數不能使用this。由於靜態函數沒有固定對象。spa
#include <bits/stdc++.h> using namespace std; class A { private : int a; public : A(int x = 0) : a(x) {} void set(int x) { a = x; } void print() {printf("%d\n", a);} }; int main() { A a, b; int x; a.set(111); b.set(222); a.print(); b.print(); return 0; }
輸出:指針
111
222code
能夠看出賦值的時候是分別給當前對象的成員賦的值。
就像上文中提到的3同樣,拿set()
函數來講,其實編譯器在編譯的時候是這樣的對象
void set(A *this, int x) { this->a = x; }
那何時要調用this指針呢?編譯器
1. 在類的非靜態成員函數中返回對象的自己時候,直接用return *this
。it
2. 傳入函數的形參與成員變量名相同時編譯
例如
#include <bits/stdc++.h> using namespace std; class A { private : int x; public : A() {x = 0;} void set(int x) { x = x; } void print() { printf("%d\n", x); } }; int main() { A a, b; int x; a.set(111); b.set(222); a.print(); b.print(); return 0; }
輸出是
0
0
這時由於咱們的set()函數中,編譯器會認爲咱們把成員x的值賦給了參數x;
若是咱們改爲這樣,就沒有問題了
#include <bits/stdc++.h> using namespace std; class A { private : int x; public : A() {x = 0;} void set(int x) { this->x = x; } void print() { printf("%d\n", x); } }; int main() { A a, b; int x; a.set(111); b.set(222); a.print(); b.print(); return 0; }
這樣輸出的就是
111
222
並且這段代碼一目瞭然,左值是類成員x,右值是形參x。