C  程序到 C 程序的翻译 

要想理解 C 的 this 指针,我们可以先把下面的 C 代码转换成 C 代码:

C 语言是没有类定义 class 关键词,但是有跟 class 类似的定义,那就是 struct 结构体。

m_price 变量是 Car 类的成员变量,那么我们可以把 Car 类和成员变量翻译成如下的 C 代码:

SetPrice 函数是 Car 类的成员函数,但是 C 程序里是没有成员函数这种概念的,所以只能把成员函数翻译成全局的函数:

为什么要加个 this 的指针呢?我们继续往下看。

在这里我们把上面 C 程序的 main 函数翻译 C 程序,是这样的:

所以最终把上述的 C 程序 转换成 C 程序的代码如下:

所以加 SetPrice 函数的第一个参数 this 指针的作用,就是为了给结构体 Car 域里的变量赋值。

this 指针的作用 

其作用就是指向成员函数所作用的对象,所以非静态成员函数中可以直接使用 this 来代表指向该函数作用的对象的指针。

下面的例子可以很好的说明 this 的作用:

输出结果:

20000
20000

接下来我们看下面的代码,你觉得输出结果是什么呢?会出错吗?

答案是正常输出 hello,你可能会好奇明明 p 指针是空的,不应该是会程序奔溃吗?别着急,我们先把上面的代码转换 C 程序,就能理解为什么能正常运行了。

所以,实际上每个成员函数的第一个参数默认都有个指向对象的 this 指针,上述情况下如果 this 指针指向的对象是空,相当于成员函数的第一个参数是 NULL,那么只要成员函数没有使用到成员变量,是可以正常执行。

那么下面这份代码执行时,就会奔溃了,因为 this 指针是空的,使用了空的指针指向了成员变量 i,程序就会奔溃。

 this 指针和静态成员函数

静态成员函数是不能使用 this 指针,因为静态成员函数相当于是共享的变量,不属于某个对象的变量。

小结

  • 通过将 C 程序翻译成 C 程序的方式,来理解 this 指针,其作用就是指向非静态成员函数所作用的对象,每个成员函数的第一个参数实际上都是有个默认 this 指针参数;

  • 静态成员函数是无法使用 this 指针。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

C this指针的理解和作用相关推荐

  1. springboot 对象 空指针_C++ this指针的理解和作用

    C++ 程序到 C 程序的翻译  要想理解 C++ 的 this 指针,我们可以先把下面的 C++ 代码转换成 C 代码:C 语言是没有类定义 class 关键词,但是有跟 class 类似的定义,那 ...

  2. C++ this指针的理解和作用

    微信公众号:「小林coding」 用简洁的方式,分享编程小知识. 01 C++ 程序到 C 程序的翻译 要想理解 C++ 的 this 指针,我们先把下面的 C++ 代码转换成 C 的代码 class ...

  3. 64位程序怎么判断指针是否有效_C 语言指针怎么理解?

    注: 看完这篇一定会让你理解透彻指针的本质 是的,这一篇的文章主题是「指针与内存模型」 说到指针,就不可能脱离开内存,学会指针的人分为两种,一种是不了解内存模型,另外一种则是了解. 不了解的对指针的理 ...

  4. C++const 对指针和引用的作用

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105065547 指 ...

  5. 指向数组的指针的理解

    指向数组的指针的理解 开发工具与关键技术:Visual Studio.C++ 作者:张国军 撰写时间:2019年05月03日 数组和指针是两种不同的类型,数组具有确定数量的元素,而指针只是一个标量值. ...

  6. JavaScript this指针的理解

    一.this 指针的理解 借鉴参考http://www.cnblogs.com/kongxy/p/4581223.html this 是 js 的关键字,代表函数运行时,自动生成的一个内部对象.只能在 ...

  7. 关于空指针(指针指向为NULL)和void类型的指针的理解

    正在学C,书上老说空指针,或者说void指针,对于我这样的生手来说,理解非常容易造成混淆,因为void这个单词的意思也是空,到底空指针的意思是指指向地址为空的类型呢,还是指void类型的指针呢 (1) ...

  8. c++中this指针的理解(转载:苦涩的茶 ——产品开发 C++类中this指针的理解)

    先要理解class的意思.class应该理解为一种类型,象int,char一样,是用户自定义的类型.用这个类型可以来声明一个变量,比如int x, myclass my等等.这样就像变量x具有int类 ...

  9. iOS经典面试题之深入解析objc对象的内存空间、数据结构以及isa指针的理解

    一.objc 对象的 isa 的指针指向什么?有什么作用? isa 等价于 is kind of: 实例对象 isa 指向类对象: 类对象指 isa 向元类对象: 元类对象的 isa 指向元类的基类: ...

最新文章

  1. Python实现获得SQLServer数据库中的表插入到Oracle数据库
  2. arduino如何调用mysql,【 实测可用 】Arduino 直接访问 mysql
  3. swscanf_s和sscanf_s的使用
  4. 08-面向对象----
  5. 「第六篇」对于电赛,我们应该看重什么?
  6. ssl提高组周六备考赛【2018.10.20】
  7. 工业以太网交换机可以家用吗?
  8. 嵌入式C/C++开发过程中日志输出的一点思考
  9. GARFIELD@01-01-2005
  10. 流程控制库async
  11. 当一盆植物在MIT成了精,不,它只是成了机器人
  12. HMM:隐马尔科夫模型 - 预测和解码
  13. 《Linux 命令行大全》
  14. 编译实验 . 递归下降分析器
  15. java dbutils_Java学习之DBUtils
  16. 洪恩软件进军网游产业 池宇峰揭密完美世界
  17. 剑指offe JZ18 删除链表的节点
  18. 张瑞申教授SSRN论文数据公开 | 公司层面气候变化暴露指数
  19. DAE模型——阅读和理解COLLADA文档(2)
  20. 苹果CEO库克: 请无所畏惧,做最不愿接受现状的人丨2018年毕业典礼演讲

热门文章

  1. java 基础包的功能_Java 8的功能基础
  2. oauth2和jwt_使用具有OAuth2的Web应用程序和JWT的使用来调用API – WSO2 API Manager
  3. Spring MVC:高级会话
  4. Spring Webflux –编写过滤器
  5. junit 参数化测试用例_JUnit:在参数化测试中命名单个测试用例
  6. java自动推断类型_Java 7的类型推断
  7. Lucene分析过程指南
  8. 通过示例Hibernate–第2部分(DetachedCriteria)
  9. hadoop简单介绍_Hadoop:简单介绍
  10. 了解Spring Web应用程序体系结构:经典方法