打印

指针问题

[复制链接]
1422|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xsgy123|  楼主 | 2014-2-27 18:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1:this指针指的是当前 调用该函数的对象,前提是这事一个 类里面的函数;然而 this指针式不能被调用的(不知道是不是这个 能否被调用,积累下来的问题,没解决,今天想起来了),那么this指针式怎么做的呢?就是说 this指针式怎么个回事?
    2:如何去快速掌握MFC这个库,怎样去学习? 多看 MFC结构图? 还是什么?

相关帖子

沙发
无冕之王| | 2014-2-27 18:39 | 只看该作者
问题没描述清楚。

使用特权

评论回复
板凳
pkat| | 2014-2-27 18:45 | 只看该作者
this是指该对象本身,只能在类内部调用该成员函数,

使用特权

评论回复
地板
angerbird| | 2014-2-27 21:14 | 只看该作者
this指针最大的作用就是它保存了当前对象的地址,并且应用指针的形式指向了当前的对象

使用特权

评论回复
5
angerbird| | 2014-2-27 21:17 | 只看该作者
这里是另一种更详细的关于this指针的用处的讲解的

使用特权

评论回复
6
angerbird| | 2014-2-27 21:17 | 只看该作者
深度探索C++对象模型对this的描述是,this是一个函数参数

float   manitude3d(const   Point3d   *_this){...}
float   Point3d::manitude3d()const{...}

这两种方式是等价的,编译器在内部将后者转化为前者,因此
obj.magintude();变成了maginitude_7Point3dFv(&obj);

如何理解“编译器在内部将后者转化为前者”这一句话呢?我们知道世界上第一个C++编译器是Cfront,Bjarne Stroustrup,Lippman等人开发的,那在当时最流行的编程语言是C,在各种机器各种操作系统下都有C的编译器版本,这样C的程序在当时是最易移植的,因此Bjarne Stroustrup决定Cfront生成等价的C代码以获得可移植性。就是说Cfront读入你编写的.cpp文件经过词法分析等编译过程,结果没有生成.obj文件却生成了一个.c文件,然后再用C编译器对.c文件进行编译链接,最终生成的程序是一个彻头彻尾的C程序(所以Cfront也被称为C 预处理器)

使用特权

评论回复
7
angerbird| | 2014-2-27 21:18 | 只看该作者
编译器在看到成员函数的定义时会直接修改源代码:修改函数名称,在函数的参数里添加这么一个名叫“this”的指针定义,对成员函数的调用也采取类似的方式,在调用语句的参数列表偷偷加上对象的地址,最后保存为.c文件,由C编译器进行最终的编译链接,生成可执行程序,可以看到经过编译器编译之后,C++的成员函数其实也就是一个普通的函数,this和element pop(sqstack *s)中的s也没有什么本质上的区别,就是一个指向数据结构的指针而已,

使用特权

评论回复
8
angerbird| | 2014-2-27 21:18 | 只看该作者
这里大家对什么是this指针已经有个感性的理解了吧
第一,this指针为什么没有定义就能直接使用,答案是编译器定义了
第二,this指针是一个函数参数,所以它的使用范围仅在成员函数内部
第三,this指针为什么指向对象?调用时偷偷把对象地址给它传递过去了

使用特权

评论回复
9
angerbird| | 2014-2-27 21:19 | 只看该作者
this指针只是一个普通的指针,被编译器定义的一个函数参数,现在,我们要证明另一点,C++的成员函数被编译之后只是普通的函数,由于VC++的this指针是寄存器变量,不能很清楚的显示这个关系,我们选用Borland C++ Builder 6.0 作为我们测试的工具,BCB依靠栈来传递对象地址

使用特权

评论回复
10
angerbird| | 2014-2-27 21:20 | 只看该作者
介绍一点C++对象模型的知识,我们知道C++的类定义包含虚函数,那么这个类产生的对象都会包含一个虚指针,虚指针会指向一个名叫虚表格的函数指针数组,数组存储的都是虚函数的地址,C++依靠这些来实现多态,而通常虚指针又位于对象的前端

使用特权

评论回复
11
smilingangel| | 2014-2-28 00:12 | 只看该作者
angerbird 发表于 2014-2-27 21:17
深度探索C++对象模型对this的描述是,this是一个函数参数

float   manitude3d(const   Point3d   *_this) ...

楼上把this指针的用法的解析的非常好的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

229

主题

2603

帖子

1

粉丝