当前位置: 首页 > news >正文

C++语法——详细剖析类成员函数在内存中存储形式(包括静态)

目录

一.存储形式和this指针用途

(一).存储形式

(二).this指针用途

二.静态成员函数


一.存储形式和this指针用途

(一).存储形式

先说结论,不管对于静态还是非静态成员,其都是存储在内存中的代码区

对此,我们可以使用代码加以验证:

class C 
{
public:
	void func()
	{
		cout << "c" << endl;
	}
	int c;
};

int main()
{
	C i;
	const char* str = "hello";//常量字符串,常量区
	printf("func: %p\n", &(C::func));
	printf("str: %p\n", str);
	return 0; 
}

 我们发现,func的地址比存在常量区的str还要低。而地址空间中,代码区就在常量区下方(低地址处)。该文章中第一张图片可以表明地址空间存储结构:Linux——进程地址空间

因为上述发现,更加佐证了类成员函数存放在代码区。

当我们通过同一个类实例化出多个对象时,为了最大化的节省空间资源,每个对象各自有一份成员变量,但共享代码区的成员函数

可以用一张图表明类中成员存储结构:

(二).this指针用途

当我们通过实例化的对象调用成员函数时,如果按照上图存储结构,因为所有的对象共享一份成员函数,那么调用的成员函数无法确定自己内部使用的成员变量是属于哪个具体对象的

对此,this指针的用途就显现出来了:确定调用该函数的实例化对象

当调用成员函数时,this指针指向调用该函数的对象。函数使用成员变量时,通过this指针指向的对象找到该变量的位置。由此,当调用函数时,只会使用本对象的数据而不会发生错乱。

二.静态成员函数

对于静态成员函数而言,其参数中没有this指针

为什么静态成员函数没有this指针?——因为作为静态成员函数,它是被整个类共享的,不存在需要识别具体对象的情况。

由此我们可以解释为什么静态成员函数可以直接通过类名访问。因为静态成员函数不需要this指针指向具体对象,换句话说,静态成员函数内部不应该使用实例化对象的成员变量,因为无法通过this指针指向具体变量,势必报错。

程序员的问题是你无法预料他在做什么,直到为时已晚——Seymour Cray(超级计算机之父)


如有错误,敬请斧正

相关文章:

  • 解决gitlab太占内存问题
  • 基于神经网络的传递函数控制器matlab实现,神经网络自己编程实现不使用matlab的工具箱
  • 超声波测距(避障)材质检测
  • GPIO 模拟SPI
  • 【云原生 · Kubernetes】Taint和Toleration(污点和容忍)
  • 10.20复习
  • 自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
  • Pygame实战(一):随机抽位置
  • vue支付项目-APP微信支付功能
  • 新手如何自学python?
  • Java的日期与时间之java.time.ZonedDateTime简介说明
  • Vue整合Markdown组件+SpringBoot文件上传+代码差异对比
  • MySQL高级篇——索引简介
  • C-内存函数(大量图解,函数实现)
  • 【STM32】MDK下的C语言基础
  • 时间复杂度分析经典问题——最大子序列和
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 2019.2.20 c++ 知识梳理
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • extjs4学习之配置
  • Java多态
  • Making An Indicator With Pure CSS
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • PHP面试之三:MySQL数据库
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spark学习笔记之相关记录
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Tornado学习笔记(1)
  • 搭建gitbook 和 访问权限认证
  • 服务器之间,相同帐号,实现免密钥登录
  • 聊聊hikari连接池的leakDetectionThreshold
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 湖北分布式智能数据采集方法有哪些?
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​一些不规范的GTID使用场景
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)换源+apt-get基础配置+搜狗拼音
  • (规划)24届春招和25届暑假实习路线准备规划
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (原)本想说脏话,奈何已放下
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET6 命令行启动及发布单个Exe文件
  • .Net各种迷惑命名解释
  • .NET建议使用的大小写命名原则
  • .NET企业级应用架构设计系列之技术选型
  • /etc/shadow字段详解
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [Android Studio] 开发Java 程序
  • [BetterExplained]书写是为了更好的思考(转载)
  • [C#]猫叫人醒老鼠跑 C#的委托及事件
  • [HarmonyOS]第一课:从简单的页面开始
  • [HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页
  • [IE9] IE9 RC版下载链接