C++基础篇--this指针

来源:互联网 发布:帝国cms 今日头条 编辑:程序博客网 时间:2024/06/05 15:48

    很多程序员C语言基础不好,结果用了好多年C++,还是知其然而不知所以然,往往经不起别人一问”xx机制怎么实现的this指针就是C++的基础机制之一。

structclass进化的第一步

设想我们是十几年前C++的设计者,从Cstruct怎么进化到C++class

struct里可以用函数指针作成员变量,并通过诸如xxx->fun()的形式调用,但和class成员函数相比:1)不能在struct内部定义函数;2)不能在struct成员函数内直接访问struct的其他成员变量。这两点形式上的局限使得struct无法直接体现面向对象的思想。怎么解决呢?问题1)struct(class)实现内部定义函数由编译器name mangling机制完成,后面讲述,这里讲第2点。

struct Base

{

     int a,b;

     void add_mem() { return(a+b); };

};

假设可在struct内定义函数,那要在函数里直接访问成员a,b,顺理成章的办法就是设法把指向结构体变量自身的指针传到成员函数内部,即由编译器把函数add_mem()变成add_mem(void *this){  return(this->a+this->b); }

这个隐含的包含对象地址的参数就是this指针,C++编译器就能自动获取对象地址赋给this,再通过一个隐含参数把this传进类的非静态成员函数,于是函数内部访问类的非静态成员变量就可以借助于this,如:

  class Point

  {

   int x, y, z;

  public:

   Point(inta, int b, int c) { x=a; y=b; z=c; }

   voidMovePoint( int a, int b, int c){ x+=a; y+=b; z+=c; }

  };

  void main( )

  {

   Pointpoint1( 0,0,0);

   point1.MovePoint(1,1,1);

  }

  MovePoint真正原型是void MovePoint( Point *this,int a, int b, int c){ this.x+=a; this.y+=b; this.z+=c; }。对象point1调用MovePoint(1,1,1)时,就把point1的地址传给了this指针,调用point1.MovePoint(1,1,1)相当于point1.MovePoint (&point1,1,1,1 )

显式使用this指针的场合:

       this指针保留了成员函数所属类的实例对象地址,形式上它通常是隐含的,编译器编译时会自动在引用成员变量的每个表达式中插入this指针。不过某些特殊场合也需要显式使用它

情况一:在类的非静态成员函数中返回类对象本身时,需要用return*this

情况二:当函数参数与成员变量同名,如:

class Date

  {

   int year, month, day;

  public:

   setYear(int year) {  year=year }

   ……

  };

setYear里无法识别哪个year是类成员,哪个是参数。因此这里就需要借用this指针:

setYear( int year) { this->year = year; }这样就不会混淆了。

注意:

      1. this指针仅作用于类的非静态成员函数内部,静态成员函数内没有this指针。

      2. this指针不是对象本身的一部分,不会影响sizeof(对象)结果。

0 0