程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC++深入詳解:this指針

VC++深入詳解:this指針

編輯:vc教程

  我們再看例2-9所示的這段代碼(EX04.CPP):

  例2-9

  #include <iOStream.h>
  class point
  {
  public:
     int x;
     int y;
     point()
     {
       x=0;
       y=0;
     }
     point(int a,int b)
     {
       x=a;
       y=b;
     }
     void output()
     {
       cout<<x<<endl<<y<<endl;
     }
     void input(int x,int y)
     {
       x=x;
       y=y;
     }
  };
  void main()
  {
     point pt(5,5);
     pt.input(10,10);
     pt.output();
  }

  我們在point類中定義了一個input函數。在這個函數中,用參數x和參數y分別給成員變量x和y進行了賦值。在main函數中,先調用pt對象的input函數,接收用戶輸入的坐標值,然後調用output函數輸出pt對象的坐標值。

  讀者可以思考一下這段程序的運行結果,然後編譯運行,看看結果和你所思考的結果是一樣的嗎?

  有的讀者可能會認為在input(int x, int y)函數中,利用形參x和形參y對point類中的成員變量x和y進行了賦值,然而事實是這樣嗎?因為變量的可見性,point類的成員變量x和y在input(int x, int y)這個函數中是不可見的,所以,我們實際上是將形參x的值賦給了形參x,將形參y的值賦給了形參y,根本沒有給point類的成員變量x和y進行賦值,程序運行的結果當然就是“5,5”了。

  如何在input(int x, int y)這個函數中對point類的成員變量x和y進行賦值呢?有的讀者馬上就想到,將input函數的參數名改一下不就可以了嗎?比如:將函數改為input(int a, int b),當然,這也是一種解決辦法。如果我們不想改變函數的參數名,那麼又如何去給point類的成員變量x和y進行賦值呢?

  在這種情況下,可以利用C++提供的一個特殊的指針——this來完成這個工作。this指針是一個隱含的指針,它是指向對象本身的,代表了對象的地址。一個類所有的對象調用的成員函數都是同一個代碼段,那麼,成員函數又是怎麼識別屬於不同對象的數據成員呢?原來,在對象調用pt.input(10,10)時,成員函數除了接收2個實參外,還接收到了pt對象的地址,這個地址被一個隱含的形參this指針所獲取,它等同於執行this=&pt。所有對數據成員的訪問都隱含地被加上了前綴this->。例如:x=0; 等價於this->x=0。

  利用this指針,我們重寫input(int x, int y)函數,結果如例2-10所示。

  例2-10

  #include <iOStream.h>
  class point
  {
  public:
     int x;
     int y;
     point()
     {
       x=0;
       y=0;
     }
     point(int a,int b)
     {
       x=a;
       y=b;
     }
     void output()
     {
       cout<<x<<endl<<y<<endl;
     }
     void input(int x,int y)
     {
       this->x=x;
       this->y=y;
     }
  };
  void main()
  {
     point pt(5,5);
     pt.input(10,10);
     pt.output();
  }

  再編譯運行,此時的結果就如預期所料了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved