先要理解class的意思。class应该理解为一种类型,象 int,char一样,是用户自定义的类型。
虽然比int char这样build-in类型复杂的多,但首先要理解它们一样是类型。
用这个类型可以来声明一个变量,比如int x, myclass my等等。
这样就像变量x具有int类型一样,变量my具有myclass类型。
理解了这个,就好解释this了,my里的this 就是指向my的指针。
如果还有一个变量myclass mz,mz的this就是指向mz的指针。 
这样就很容易理解this 的类型应该是myclass *,而对其的解引用*this就应该是一个myclass类型的变量。
通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名,就用this这样的指针来使用变量自身。

1. this指针的用处:
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。
也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .

2. this指针的使用:
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;
另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。

3. this指针程序示例:
this指针是存在与类的成员函数中,指向被调用函数所在的类实例的地址。
根据以下程序来说明this指针

#include<iostream.h>
class Point
{
int x, y;
public:
Point(int a, int b) { x=a; y=b;}
Void MovePoint( int a, int b){ x+=a; y+=b;}
Void print(){ cout<<"x="<<x<<"y="<<y<<endl;}
};
void main( )
{
Point point1( ,);
point1.MovePoint(,);
point1.print( );
}

当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。

MovePoint 函数的原型应该是 void MovePoint( Point *this, int a, int b);

第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。
这样point1的地址传递给了this,所以在 MovePoint函数中便显式的写成:

void MovePoint(int a, int b) { this->x +=a; this-> y+= b;}

即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。
即该函数过程可写成 point1.x+= a; point1. y + = b;

4. 关于this指针的一个精典回答:
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。

最新文章

  1. soundtouch变速wsola算法之改进
  2. Ruby 方法
  3. [New Portal]Windows Azure Virtual Machine (17) Virtual Machine成本分析
  4. 56. Android中进程优先级小结
  5. Linux运维初级教程(三)文件及目录权限
  6. servlet请求转发、包含以及重定向
  7. 关于在 mac上配置pytesseract的相关问题
  8. AAC 格式分析
  9. CentOS6.5安装图形界面
  10. 【SHOI2012】魔法树(树链剖分,线段树)
  11. springmvc解决中文乱码问题
  12. nginx + gunicorn + flask项目发布
  13. js中的原型对象链
  14. 利用 Docker 搭建单机的 Cloudera CDH 以及使用实践
  15. Python 3.5 in win10 pip install Orange3
  16. overflow属性的用法
  17. 统计UPD丢包工具
  18. delphi实现数字签名
  19. JQuery EasyUI 日期控件 怎样做到只显示年月,而不显示日
  20. 一次tomcat数据乱码事件

热门文章

  1. 【原创】大叔经验分享(57)hue启动coordinator时报错
  2. spring-test跟junit结合单元测试获取ApplicationContext实例的方法
  3. O051、Create Volume 操作 (Part II)
  4. 嵌套For循环性能优化
  5. 一点css 基础
  6. JavaWeb【六、JavaBean】
  7. php生成器yield
  8. 【2017-04-10】js来控制导航栏在滚动条拉到一定位置时显示
  9. IPC之mq_sysctl.c源码解读
  10. 特殊字符的过滤方法,防sql防注入代码的过滤方法