C++中为什么存在this指针?
在这篇文章中 初识类和对象,谈到了类的初步认识和基本操作方法。
成员函数存储在公共的代码段,不同的对象调用成员函数时候,那么编译器如何知道具体操作的是哪一个对象呢?
在这里就引出了this指针。
C++编译器给每个 “非静态的成员函数” 增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过这个指针来完成的。只不过所有的操作对用户来说都是透明的,不需要用户来传递,编译器自动完成。
this
指针特性:
- 只能在“成员函数”中使用
this
指针类型: 类类型 *const (加const是为了保证,指针的指向不被更改)this
指针不存储在对象中,不影响对象大小,且始终指向当前对象this
指针是“成员函数”的第一个隐藏参数,由编译器自动给出- 主要是通过ecx寄存器来传递(并不是所有的)
例:
class Student
{
private:char _name[20];char _sex[5];int _age;
public:void StudentInit(const char *name, const char *sex, int age);void Print();
};
其操作方法:
其最后的输出都是一样的,因为this
为隐藏指针,编译器会自动加上。
this指针可以为空嘛?
- 当以对象调用成员函数时,this指针不可能为空。
- 当以指针ptr调用成员函数时,是将ptr作为参数传递给this指针,若ptr为空,那么this指针就为nullptr
- this指针为空,成员函数可以正常调用。但若是成员函数访问了成员变量或者调用了有成员变量的成员函数,程序会崩溃。
成员变量相当于成员函数的全局变量。
但是成员变量在后,成员变量的使用在前,编译器为什么不报错呢?
编译器处理类的方法:
- 识别类名
- 识别成员变量
- 识别成员函数,并对函数进行修改----增加
this
指针
C++中为什么存在this指针?相关推荐
- C语言中的sizeof中的数组和指针
1.引子 今日在看动态规划的0-1背包问题,看完后还是打算自己写着试试,毕竟实践才能出真知嘛.动态规划的结果是个二维数组dp,我copy书上的例子进行初始 memset(dp,0,sizeof(dp) ...
- 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明...
[VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...
- MFC类中获得其它类指针
MFC类中获得其它类指针 从视图类获得文档类的指针是很容易的,用GetDocument即可,然而只能从视图类获得文档类的指针是远远不够的,每个类都有获得其它各个类指针的一套方法,本文归纳如下 AD: ...
- python中的列表是指针吗_Python中的指针——到底指什么(二)
在 Python中的指针--到底指什么(一) 中,我们知道在Python的一切都是对象,变量其实是指向PyObject对象的名称,对不可变变量进行操作后,名称指向了另一个PyObject. 扣留对象 ...
- C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针
C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针 在这个系列的"C#调用C++DLL的小总结6---C++Dll中指针的释放问题 "中曾经详细说过类似的问 ...
- C++中引用传递与指针传递区别(进一步整理)
C++中引用传递与指针传递区别(进一步整理) 博客分类: C/C++ CC++C#J# 从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变 ...
- vue项目:this.function()中关于:this指针失效的问题
vue项目:this.function()中关于:this指针失效的问题 参考代码:第二种 案例代码 · 代码解说 · 如下: this.nullArrImg= true;//缺省图显示,表示数据为空 ...
- C++中的引用与指针的区别
C++中的引用与指针的区别 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象 ...
- c6011取消对null指针的引用_COM编程攻略(二十二 IDL中的枚举,指针,数组)
上一篇: Froser:COM编程攻略(二十一 异步)zhuanlan.zhihu.com 本篇主要讲idl的一些语法特性. idl的语法和C语言非常类似,但是它扩展了一些特性,这些特性用于兼容其它 ...
- 取消对 null 指针“l”的引用。_彻底理解链表中为何使用二级指针或者一级指针的引用...
在用c/c++写数据结构程序时,链表和二叉树中经常需要用到二级指针或者一级指针的引用,那么什么时候用什么时候不用呢? 先看一个简单的c++链表操作程序: [cpp] view plaincopy/* ...
最新文章
- python爬虫之Scrapy框架的post请求和核心组件的工作 流程
- MySql批量插入时,如何不插入重复的数据
- Go 为什么这么“快”
- 原生JS DOM操作方法汇总
- 关于 Hive 报 SemanticException 错误的问题
- iOS url出现特殊字符处理 -- stringByAddingPercentEncodingWithAllowedCharacters
- linux-Centos7安装nginx
- 在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录...
- 碱度控制化学品行业调研报告 - 市场现状分析与发展前景预测
- php 百度地图根据经纬度获取地址,使用百度地图api根据经纬度获取位置
- 华为asph是什么型号_华为手机各系列有什么区别 华为手机各系列介绍
- 求素数常用的几种方法
- 明明都保意外,定期寿险和意外险到底区别在哪里?
- 移动硬盘格式化(pc和mac共用)-菜鸟级解决方案[转]
- 大学计算机基础方案一,《大学计算机基础》实验实施方案-学生用汇.docx
- 搜索引擎的目标是什么?
- MAC地址,IP地址和ARP协议
- 【activiti】流程变量
- “Big O”符号的简单英文解释是什么?
- 马斯克:加州时间周四下午2点特斯拉有新闻发布
热门文章
- [嘭嘭养成记]2. 在运行时将完整动作分割成局部动作
- cisco ssl vpn设备和outlook owa渗透测试
- 计算机应用技术目标地域分析100字,【计算机应用论文】威客模式计算机应用论文(共3100字)...
- 计算压缩比的程序matlab,基于MATLAB的图象压缩程序实现
- 三部门联合推进“互联网+不动产登记”,国图一体化平台响应升级!
- 移动硬盘中的文件双击显示“文件或目录损坏且无法读取”
- Labview程序内存释放
- Shopee退货运费是由谁承担?
- Java文字冒险游戏方案,用木兰编程语言编写文字冒险游戏(前八章)
- 电子承兑汇票被拒付可以诉讼什么请求