this指標

#include

#include

class Employee

{

int EmpId;

char name[20];

public:

void outputEmp();

Employee()

{

EmpId = 0;

strcpy(name, "ZZZ");

}

void setEmp(int id, char *n)

{

EmpId = id;

strcpy(name, n);

}

};

void Employee::outputEmp()

{

cout << Employee->EmpId << '\\t';

cout << (*this).name << endl;

}

int main()

{

Employee emp1;

cout << "ID\\tEmpName\\n";

cout << "---\\t-------\\n";

emp1.outputEmp();

emp1.setEmp(101, "Tom");

emp1.outputEmp();

return 0;

}

this指標是指向資料成員還是物件,每本書ㄉ說法不一樣????

還有以上程式書本說this->EmpId相當於Employee->EmpId 但因為此敘述是在類別內部所以不能使用Employee->EmpId 必須以this->EmpId或(*this).EmpId....但陷在我把它寫在類別外部但都會出錯,請高手大大們賜教???

4 Answers

Rating
  • Rody
    Lv 5
    1 decade ago
    Best Answer

    this 是指向物件本身的指標, 他可以指向物件裡的成員, 可以指向成員, 不代表 this 就是指向成員, 他是指向物件本身, 以物件內的成員函數而言, 不需要特別寫 this->資料成員 或者 (*this).資料成員, 因為對物件內的成員函數而言, 寫資料成員變數名稱本身就隱含了 this-> 的指標取值你所謂的出錯, 應該是你寫 Employee->EmpId 這裡出錯, 這個語法本身有問題, 只有指標可以使用 -> 這個符號, 但 Employee 本身是物件類別名稱, 並不是指標, 因此語法本身就不正確, 至於 (*this).name 則沒有問題, 寫成 this->name 或 name 都是對的, 因為這些都代表同一件事, 而且即使這些變數都是私有變數, 但是對成員函數來說不重要, 一樣都可以存取, 所以直接存取 name 或 EmpId 是沒有問題的 (但是物件外就不能直接存取了, 這叫資料隱藏, 細節請翻書)以下是修改後, 可以直接執行的程式碼:#include <string.h>#include <iostream.h>class Employee{ int EmpId; char name[20];public: void outputEmp(); Employee(){  EmpId = 0;  strcpy(name, "ZZZ"); } void setEmp(int id, char *n){  EmpId = id;  strcpy(name, n); }};void Employee::outputEmp(){ cout << EmpId << '\t';//改了這裡 cout << (*this).name << endl;}int main(){ Employee emp1; cout << "ID\tEmpName\n"; cout << "---\t-------\n"; emp1.outputEmp(); emp1.setEmp(101, "Tom"); emp1.outputEmp(); return 0;}

    2006-09-11 23:38:05 補充:

    以上面的例子而言, main 裡面執行到 emp1.outputEmp(); 這行時, 如果你執行偵錯, 你應該可以看到 emp1 的位址 (利用監看 &emp1), 假設你看到的位址是 0x1234, 這時候跳入函式裡面, 你再利用監看功能, 監看 this 的數值, 你就會看到 0x1234, 這就代表, 此時的 this=&emp1, 也就是 (*this)=emp1, 我這裡的等號是說明左右相等

    2006-09-11 23:41:28 補充:

    因此此時你可以當成你宣告 Employee *p=&emp1; 此時的 this 就相當於我這裡的 p, 但是差別在 this 可以存取私有變數, 但是 p 不行, outputEmp 裡面的 EmpId 可以看成 p->EmpId, (*this).name 也可以看成 emp1.name

    2006-09-11 23:56:13 補充:

    this 是指向物件本身的指標 -- 就像是我上面的 p 也是指向 emp1 這個物件的指標他可以指向物件裡的成員 -- 就是她可以做類似 this->name 這種指向 name 這類成員的動作可以指向成員, 不代表 this 就是指向成員 -- 是說你可以寫 this->name 但 this != &name後面那句話, 就是說明上面寫的 outputEmp 裡面的 EmpId 你可以看成 this->EmpId的意思 (這是隱含的, 你不需要寫出來, 他也是這個意思)

    2006-09-12 00:08:10 補充:

    也許你還有個疑問, 為什麼一定要用 this 來存取 name 之類的東西, 這是因為 class 本身也是一種結構, 在你宣告 Employee emp1; 之前, name 並不存在, 你宣告了之後, name 才存在於 emp1 裡面, 如果你又宣告了 Employee emp2; 這時候就有兩個 name, 存在於 emp1 和 emp2 裡面如果此時你執行了 outputEmp, 那此時的 name 又是誰的 name, 編譯器怎麼知道呢? 就是透過隱含的 this

    2006-09-12 00:09:03 補充:

    this 紀錄實際物件的位址, 並且傳入成員函式, 讓成員函式知道是誰呼叫了這函式, 函式才知道這時候的 name 是誰的, 這樣你明白了嗎?

  • 1 decade ago

    Rody大大以下這段話我看不懂,可以以本程式舉個小例子就好....感激不盡!

    this 是指向物件本身的指標, 他可以指向物件裡的成員, 可以指向成員, 不代表 this 就是指向成員, 他是指向物件本身, 以物件內的成員函數而言, 不需要特別寫 this- 資料成員 或者 (*this).資料成員, 因為對物件內的成員函數而言, 寫資料成員變數名稱本身就隱含了 this- 的指標取值

  • 1 decade ago

    this 是一個語法糖, 如果我們有這麼一個東西:

    struct Klass {

    int data;

    Klass test(){ data = 5; }

    };

    int main() {

    Klass c;

    c.test();

    }

    編譯器大概會這樣看待它:

    struct Klass {

    Klass test(Klass *this){ this->data = 5; }

    };

    int main() {

    Klass c;

    Klass::test(c);

    }

  • 1 decade ago

    指向目前正在呼叫,或欲傳回的物件。

    2006-09-10 20:32:59 補充:

    講簡單一點就是,A物件呼叫,就傳回A物件;B物件呼叫,就傳回B物件。

Still have questions? Get your answers by asking now.