为了能让大家看清 this 指针的本质,我们会先讲一点 C++ 的历史——C++ 程序到C程序的翻译过程。

C++ 程序到C程序的翻译

C++ 是在C语言的基础上发展而来的,第一个 C++ 的编译器实际上是将 C++ 程序翻译成C语言程序,然后再用C语言编译器进行编译。

C语言没有类的概念,只有结构,函数都是全局函数,没有成员函数。翻译时,将 class 翻译成 struct、对象翻译成结构变量是显而易见的,但是对类的成员函数应该如何翻译?对myCar.Modify();这样通过一个对象调用成员函数的语句,又该如何翻译呢?

C语言中只有全局函数,因此成员函数只能被翻译成全局函数;myCar.Modify();这样的语句也只能被翻译成普通的调用全局函数的语句。那如何让翻译后的 Modify 全局函数还能作用在 myCar 这个结构变量上呢?答案就是引入“this 指针”。下面来看一段 C++ 程序到C 程序的翻译。

C++程序:

class CCar

{

public:

int price;

void SetPrice(int p);

};

void CCar::SetPrice(int p)

{

price= p;

}

int main()

{

CCar car;

car.SetPrice(20000);

return 0;

}

翻译后的C程序(此程序应保存为扩展名为 .c 的文件后再编译):

struct CCar

{

int price;

};

void SetPrice(struct CCar* this, int p)

{

this->price = p;

}

int main()

{

struct CCar car;

SetPrice(&car, 20000);

return 0;

}

可以看出,类被翻译成结构体,对象被翻译成结构变量,成员函数被翻译成全局函数。但是C程序的全局函数 SetPrice 比 C++ 的成员函数 SelPrice 多了一个参数,就是struct CCar *this。car.SetPrice(20000);被翻译成SetPrice(&car, 20000);,后者在执行时,this 形参指向的正是 car 这个变量,因而达到了 SetPrice 函数作用在 car 变量上的效果。

思考题:以上翻译还不完整,因为构造函数的作用没有体现出来。思考构造函数应该如何翻译。另外,静态成员函数和静态成员变量应如何翻译?

this 指针的作用

实际上,现在的C编译器从本质上来说也是按上面的方法来处理成员函数和对成员函数的调用的,即非静态成员函数实际上的形参个数比程序员写的多一个。多出来的参数就是所谓的“this指针”。这个“this指针”指向了成员函数作用的对象,在成员函数执行的过程中,正是通过“Ihis指针”才能找到对象所在的地址,因而也就能找到对象的所有非静态成员变量的地址。

下面程序的运行结果能够证明这一点:

#include

using namespace std;

class A

{

int i;

public:

void Hello(){ cout << "hello" << endl; }

};

int main()

{

A* p = NULL;

p -> Hello();

}

程序的输出结果是:

hello

在上面的程序中,p 明明是一个空指针,为何通过它还能正确调用 A 的成员函数 Hello 呢?因为,参考上面 C++ 到C程序的翻译,P->Hello()实质上应该是Hello(p),在翻译后的 Hello 函数中,cout 语句没有用到 this 指针,因此依然可以输出结果。如果 Hello 函数中有对成员变量的访问,则程序就会出错。

C++ 规定,在非静态成员函数内部可以直接使用 this 关键字,this 就代表指向该函数所作用的对象的指针。看下面的例子:

#include

using namespace std;

class Complex {

public:

double real, imag;

Complex(double r, double i) : real(r), imag(i) {}

Complex AddOne()

{

this->real++;

return *this;

}

};

int main()

{

Complex cl(1, 1), c2(0, 0);

c2 = cl.AddOne();

cout << c2.real << "," << c2.imag << endl; //输出 2,1

return 0;

}

第 9 行,this 指针的类型是 Complex*。因为 this 指针就指向函数所作用的对象,所以 this->rear 和 real 是完全等价的。*this代表函数所作用的对象,因此执行第 16 行,进入 AddOne 函数后,*this实际上就是 c1。因此的 c2 值会变得和 c1 相同。

因为静态成员函数并不作用于某个对象,所以在其内部不能使用 this 指针;否则,这个 this 指针该指向哪个对象呢?

matlab this指针,C++ this指针(直戳本质)相关推荐

  1. 【转】C++ this指针(直戳本质)

    转自:http://c.biancheng.net/view/170.html 为了能让大家看清 this 指针的本质,我们会先讲一点 C++ 的历史--C++ 程序到C程序的翻译过程. C++ 程序 ...

  2. matlab二重指针,VC++中函数返回数组指针或者带指针的结构体的编译方式是否可取? - 程序语言 - 小木虫 - 学术 科研 互动社区...

    libralibra 构造函数+析构函数应该是比较正规的做法吧, 你的结构体/类被提早释放的问题,是不是那个结构体是局部变量,当超出作用域时对象被销毁,如果存在析构函数,会被默认调用, 如果你返回结构 ...

  3. C语言指针 动画展示 指针到底是什么 指针的本质 C语音深入剖析

    是不是一直搞不懂C语言的指针,看完这个动画,你就全明白了 是不是一直搞不懂C语言的指针,看完这个动画,你就全明白了_哔哩哔哩_bilibili [指针的秘密]这可能是最好懂的C语言指针讲解?! [指针 ...

  4. 野指针 空指针 悬空指针 智能指针

    C语言中"野指针"."悬空指针"是什么? C语言中"野指针"."悬空指针"是什么?_不脱发的程序猿的博客-CSDN博客_ ...

  5. 你必须知道的指针基础-3.指针的移动及指针的危险

    一.指针的移动 1.1 指针的向前及向后移动 指针每次加一就是指针向前移动指针类型对应的字节数.下面通过一个int指针来指向一个int数组,看看指针的加法运算到底是个什么鬼? int nums[]={ ...

  6. 空指针、悬空指针、野指针

    文章目录 前言 一.指针? 二.指针的应用场景 三. 空指针 四. 悬空指针 五. 野指针 正确用法 总结 前言 相信很多小伙伴对指针的使用都有一定的了解了.但更多的人可能对指针又爱又恨.这次我们谈点 ...

  7. printf 指针地址_指针搞都不懂,好意思说自己会C语言?

    C语言面试必问知识点之「指针」 一.指针相关概念 指针与地址 我们使用的计算机,系统为了更好地管理我们的内存,就为内存区的每一个字节都分配一个唯一编号,这就是"地址". 指针的实质 ...

  8. [指针八]有关指针的面试题

    有关指针的经典面试题 C语言为何如此长寿并实用?C++为什么有那么多精彩?指针可以说是C/C++中的灵魂所在,虽然早期中pascal也有指针,但是和C/C++比起来不是一个级别的.今天为大家深入浅出的 ...

  9. ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析...

    Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...

最新文章

  1. Erlang转JAVA,将Erlang UTF-8编码的字符串转换为java.lang.String
  2. 我是一只IT小小鸟读书笔记3
  3. ssm(Spring+Spring mvc+mybatis)——web.xml
  4. 服务器控件开发之复杂属性
  5. 数据结构上机实践第四周项目6- 循环双链表应用
  6. 在Visio里加上、下标方法
  7. mysql中where的用法_详解MySQL中WHERE子句的用法
  8. phpwamp mysql_PHPWAMP配置修改与Web服务器和php以及mysql的具体配置修改
  9. c# 实现图片转双层PDF,PDF转OFD格式文件
  10. 采用参数服务器的分布式机器学习
  11. OSI七层协议模型与记忆口诀
  12. Hint: If you want to see a list of allocated tensors when OOM happens 的解决办法
  13. 编程导师Ivor Horton新作《Java 7入门经典》即将出版
  14. Python绘制美国队长盾牌
  15. 不同等级的UI设计师工作内容有什么区别?
  16. 中标麒麟B040版本桌面系统root密码破解
  17. 【monkey】monkey测试入门
  18. 用html给一张图片做多个热区链接,html 锚点链接 图像热区链接
  19. matlab三角形单元,平面三角形单元常应变单元matlab程序的编制.doc
  20. mysql按中文拼音字母顺序排序

热门文章

  1. html:(13):ol-li和div作用
  2. java学习(10):数据类型
  3. Linux 多线程开发-线程创建pthread_creat
  4. java numa_Java只使用2个CPU中的1个和NUMA(Neo4J)
  5. java json 修改字段_JSON文件-Java:编辑/更新字段值
  6. 乔治敦大学计算机专业排名,2020USNEWS数据科学与分析专业综合排名(上)
  7. IO_ADDRESS()的实现【转】
  8. CF989E A Trance of Nightfall(概率+矩阵快速幂优化+倍增)
  9. STM32位带操作实现过程解析
  10. [译]SQL SERVER 2016 – Temporal Tables