C++ this指針的含義 轉
先要理解class的意思。class應該理解爲一種類型,象 int,char一樣,是用戶自定義的類型。(雖然比int char這樣build-in類型複雜的多,但首先要理解它們一樣是類型)。用這個類型可以來聲明一個變量,比如int x, myclass my等等。這樣就像變量x具有int類型一樣,變量my具有myclass類型。
理解了這個,就好解釋this了,my裏的this 就是指向my的指針。如果還有一個變量myclass mz,mz的this就是指向mz的指針。 這樣就很容易理解this 的類型應該是myclass *,而對其的解引用*this就應該是一個myclass類型的變量。
通常在class定義時要用到類型變量自身時,因爲這時候還不知道變量名(爲了通用也不可能固定實際的變量名),就用this這樣的指針來使用變量自身。
例如,調用date.SetMonth(9) <===> SetMonth(&date, 9),this幫助完成了這一轉換 .
#include<iostream.h>
class Point
{
int x, y;
public:
Point(int a, int b) { x=a; y=b;}
Void MovePoint( int a, int b){ x+=a; y+=b;}
Void print(){ cout<<"x="<<x<<"y="<<y<<endl;}
};
{
Point point1( 10,10);
point1.MovePoint(2,2);
point1.print( );
}
MovePoint 函數的原型應該是 void MovePoint( Point *this, int a, int b);第一個參數是指向該類對象的一個指針,我們在定義成員函數時沒看見是因爲這個參數在類中是隱含的。這樣point1的地址傳遞給了this,所以在 MovePoint函數中便顯式的寫成:
void MovePoint(int a, int b) { this->x +=a; this-> y+= b;}
即可以知道,point1調用該函數後,也就是point1的數據成員被調用並更新了值。
即該函數過程可寫成 point1.x+= a; point1. y + = b;
你可以看見桌子、椅子、地板等,
但是房子你是看不到全貌了。
你可以看到它的成員函數、成員變量,
但是實例本身呢?
this是一個指針,它時時刻刻指向你這個實例本身。
C++ this指針的用法
this指針的含義及其用法:
1. this指針是一個隱含於每一個成員函數中的特殊指針。它指向正在被該成員函數操作的那個對象。
2. 當對一個對象調用成員函數時,編譯程序先將對象的地址賦給this指針,然後調用成員函數,每次成員函數存取數據成員時,由隱含使用this指針。
3. 當一個成員函數被調用時,自動向它傳遞一個隱含的參數,該參數是一個指向這個成員函數所在的對象的指針。
4. 在C++中,this指針被隱含地聲明爲: X *const this,這意味着不能給this 指針賦值;
在X類的const成員函數中,this指針的類型爲:const X* const, 這說明this指針所指向的這種對象是不可修改的(即不能對這種對象的數據成員進行賦值操作);
5. 由於this並不是一個常規變量,所以,不能取得this的地址。
6. 在以下場景中,經常需要顯式引用this指針
(1) 爲實現對象的鏈式引用(如例1);
(2) 爲避免對同一對象進行賦值操作(如例2);
(3) 在實現一些數據結構時,如list.
7. 舉例:
//例1:
/* 編輯編譯環境:Dev-C++ 4.9.9.2 */
/* file: person.cpp */
#include <stdio.h>
#include <string.h>
class Person {
public:
typedef enum {
BOY = 0,
GIRL = !BOY
} SexType;
public:
Person(char *n, int a, SexType s)
{
name = new char[strlen(n)+1]; //這裏的 name 等價於this->name
strcpy(name,n); //這裏的 name 等價於this->name
age = a; //這裏的 age 等價於this->age
sex = s; //這裏的 sex 等價於this->sex
}
int get_age(void) const
{
//age++; //compile error, 因爲 age等價於this->age,而 get_age又是一個const成員函數,
//不能對 this指針所指向的這種對象進行修改,這也是const的一個作用。
//這樣做的好處是,增加了代碼的健壯性。
return age;
}
Person& add_age(int a)
{
age +=a;
return *this; // 返回本對象的引用
}
private:
char *name;
int age;
SexType sex;
};
void TestPerson(void)
{
Person ZhangSan("ZhangSan", 20, Person::BOY);
printf("ZhangSan.age = %d\n", ZhangSan.get_age());
printf("ZhangSan.add_age = %d\n", ZhangSan.add_age(1).get_age()); //增加1歲的同時,可以對新的年齡直接輸出;
return;
}
int main(void)
{
TestPerson();
while(1);
}
/* result:
ZhangSan.age = 20
ZhangSan.add_age = 21
*/
//例2:
/* 編輯編譯環境:Dev-C++ 4.9.9.2 */
/* file: location.cpp */
#include <stdio.h>
class Location {
int X,Y;//默認爲私有的
public:
void init(int x,int y) { X =x; Y = y;};
void assign(Location& pointer);
int GetX(){ return X; }
int GetY(){ return Y; }
};
void Location::assign(Location& pointer)
{
if(&pointer!=this) //同一對象之間的賦值沒有意義,所以要保證pointer不等於this
{
X=pointer.X;
Y=pointer.Y;
}
}
int main()
{
Location x;
x.init(5,4);
Location y;
y.assign(x);
printf("x.X = %d, x.Y = %d \n", x.GetX(), x.GetY());
printf("y.X = %d, y.Y = %d ", y.GetX(), y.GetY());
while(1);
return 0;
}
/* result:
x.X = 5, x.Y = 4
y.X = 5, y.Y = 4
*/