C++学习之this指针的用法

   之前在博客中分享了很多关于c++学习中的重要知识点,今天继续和大家分享:关于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  */   以上文章摘自凌阳嵌入式Linux培训训讲师:Leo Chin 老师的博客!更多关于C++知识:http://www.cnblogs.com/hnrainll/category/234345.html