什麼是this this是一個const指針,存的是 當前對象 的地址,指向 當前對象 ,通過this指針可以訪問類中的所有成員。 當前對象是指正在使用的對象,比如 ,`a`就是當前對象。 關於this 1. 每個對象都有this指針,通過this來訪問自己的地址。 2. 每個成員函數都有一個指針形 ...
什麼是this
this是一個const指針,存的是當前對象的地址,指向當前對象,通過this指針可以訪問類中的所有成員。
當前對象是指正在使用的對象,比如a.print()
,a
就是當前對象。
關於this
- 每個對象都有this指針,通過this來訪問自己的地址。
- 每個成員函數都有一個指針形參(構造函數沒有這個形參),名字固定,稱為this指針,this是隱式的。
- 編譯器在編譯時會自動對成員函數進行處理,將對象地址作實參傳遞給成員函數的第一個形參this指針。
- this指針是編譯器自己處理的形參,不能在成員函數的形參中添加this指針的參數定義。
this只能在成員函數中使用,全局函數,靜態函數不能使用this。因為靜態函數沒有固定對象。
this的使用
#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
222
可以看出賦值的時候是分別給當前對象的成員賦的值。
就像上文中提到的3一樣,拿set()
函數來說,其實編譯器在編譯的時候是這樣的
void set(A *this, int x) {
this->a = x;
}
何時調用
那什麼時候要調用this指針呢?
1. 在類的非靜態成員函數中返回對象的本身時候,直接用return *this
。
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。