c++ 中 this指針的使用


轉自 :http://www.cnblogs.com/hnrainll/archive/2011/05/20/2051939.html


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 
*/



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com