1. 程式人生 > >C++——this指針

C++——this指針

類對象 函數 我們 靜態成員 urn 第一個 問題 turn 地址傳遞

一、this指針

  1、this指針的引入

  • 應用場景1:當我們在類中定義了一個變量同時在類成員函數中定義了一個同名變量,即變量名重復時我們又想使用類中定義的變量,此時便需要this指針
  • 應用場景2:當成員函數的參數與類的成員函數名相同時,在賦值的時候要用this指針,類似場景1,即this.a=a;不能寫成a=a;
  • 應用場景3:在類的非靜態成員函數中返回類對象本身的時候,直接使用return *this;

  2、this指針僅存在於類的成員函數中,指向被調用函數所在類實例的地址。

  •  1 class Point
     2 { 
     3   int x, y;
     4 public:
     5   Point(int
    a, int b) { x=a; y=b;} 6 Void MovePoint( int a, int b){ x+=a; y+=b;}//函數內部定義默認為內聯函數 7 }; 8 void main( ) 9 { 10 Point point1( 10,10); 11 point1.MovePoint(2,2); 12 }
    • 當point1調用MovePoint(2,2)函數時,即將point1對象的地址傳遞給了MovePoint()成員函數的默認的this指針。
    • MovePoint()函數的原型應該是 void MovePoint(Point *this,int a,int b);第一個參數是指向該類對象的一個指針,我們在定義成員函數式未看見是因為這個參數在類中是隱含的。函數的具體實現過程也可以替換成this.x+=a;this.y+=b;

  3.關於this指針的一些問題

  • this指針只能在成員函數中使用,全局函數,靜態函數都不能使用this指針。。。成員函數默認的第一個參數為T *const this
    • 1 class A
      2 {
      3 public:
      4 int fun(int p){}
      5 }
      6 
      7 
      8 //fun 的原型在編譯器看來應該是
      9 //int fun(A *const this,int p);
  • this指針在函數的開始前構造,在成員函數結束後清除。當調用一個類的成員函數時,編譯器將類的指針作為成員函數的this參數傳遞進去
    • A a;
      a.fun(1);
      //編譯器會將此次調用編譯成:
      A::fun(&a,1
      );
  • this指針存放在何處?堆、棧、全局變量、還是其他
    • this指針會因編譯器的不同而有不同的存儲位置,可能是棧,可能是寄存器,也可能是全局變量。

C++——this指針