81 C++对象模型探索。数据语义学 - 静态成员变量的存取,非静态成员变量的存取

一,静态成员变量的存取

静态成员变量只有一个实体,保存在可执行文件的数据段中,如果没有初始化则保存在数据段的BBS中,由于存储在执行文件的数据段中,因此在编译阶段就会确定地址。当程序编译完成后,不管运行多少次,都是一个地址

静态成员变量:可以当做一个全局变量,但是他只在类的空间内可见,引用时用 类名::静态成员变量名

//为了方便查看 反汇编 的代码都执行了些啥,直接将这三行裸体的放在这里,发现其反汇编的代码是一样的,因此说这三种方式是一样的。
    Teacher7::m_si  = 888888;
008FCA12  mov         dword ptr [Teacher7::m_si (0905000h)],0D9038h  
    tea.m_si  = 999999;
008FCA1C  mov         dword ptr [Teacher7::m_si (0905000h)],0F423Fh  
    ptea->m_si  = 888999;
008FCA26  mov         dword ptr [Teacher7::m_si (0905000h)],0D90A7h  

class Teacher7 {
public:int m_i;static int m_si;//只是声明,没有定义,因此不分配空间。int m_j;static int m_sj;int m_k;static int m_sk;char m_c;int m_n;
};int Teacher7::m_si = 999;void main() {//静态成员的访问和赋值,如下的三种方式都一样的,可以通过查看汇编来证明cout << Teacher7::m_si << endl;Teacher7 tea;Teacher7* ptea = new Teacher7();cout << tea.m_si << endl;cout << ptea->m_si << endl;Teacher7::m_si = 888;cout << Teacher7::m_si << endl;cout << tea.m_si << endl;cout << ptea->m_si << endl;tea.m_si = 777;cout << Teacher7::m_si << endl;cout << tea.m_si << endl;cout << ptea->m_si << endl;ptea->m_si = 666;cout << Teacher7::m_si << endl;cout << tea.m_si << endl;cout << ptea->m_si << endl;//为了方便查看 反汇编 的代码都执行了些啥,直接将这三行裸体的放在这里Teacher7::m_si  = 888888;tea.m_si  = 999999;ptea->m_si  = 888999;cout << "duandian" << endl;
}

二,非静态成员变量的存储

静态成员变量的存储(普通的成员变量),存放在类的对象总,存取通过类对象,或者类对象指针完成。具体来说是分为:通过类对象的成员函数访问,通过类对象指针的成员函数访问,类对象直接访问,类对象指针直接访问。

这个比较简单,我们就不写例子了。

要注意的是,对于普通成员的访问,编译器本质是 通过:

类对象的首地址 + 成员变量的偏移量     来访问的。

如下图。

我们还可以得出一个结论:在没有虚函数的情况下,在没有父类的情况下:

&Teacher 的值  和 第一个变量的地址是一样的。 

在通过成员函数访问成员变量的时候,编译器角度是加上了一个 Teacher * const this的指针。

但是有虚基类的时候,会有不同,后边会讲到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20240127如何在线识别德语字幕?

20240127如何在线识别德语字幕&#xff1f; 2024/1/27 11:42 1945[科尔贝格]Kolberg 01:48:49 接近109分钟 德语视频的字幕OCR适配&#xff1a; 1、whisper&#xff0c;8:39-8:58&#xff0c;使用GTX1080需要接近20分钟。对整机性能要求比较重&#xff0c;特别吃显卡&#xff…

LabVIEW信号时间间隔测量

用LabVIEW软件平台开发一个用于测量两路信号时间间隔的系统。系统利用LabVIEW的数据采集和处理能力&#xff0c;能够准确测量并分析来自不同硬件板卡的信号时间间隔&#xff0c;这对于精确控制和数据分析至关重要。 系统主要由以下几部分组成&#xff1a;数据采集卡、信号处理…

MySQL:事务隔离级别详解

事务一共有四个特性&#xff1a;原子性、隔离性、持久性、一致性。简称ACID。本文所将就是其中的隔离性。 1、事务中因为隔离原因导致的并发问题有哪些&#xff1f; 脏读&#xff1a;当事务A对一个数据进行修改&#xff0c;但这个操作还未提交&#xff0c;但此时事务B就已经读…

ArrayList集合简单源码分析+一道面试题

ArrayList类中的属性 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {java.io.Serialprivate static final long serialVersionUID 8683452581122892189L;/*** DEFAULT_CAPACITY表…

【ASP.NET Core 基础知识】--数据库连接--数据迁移和代码优先开发

一、数据迁移 1.1 定义和用途 数据迁移是指将数据从一个存储系统、数据格式、应用程序或硬件平台转移到另一个的过程。这个过程可以涉及数据的转换、清洗和验证&#xff0c;以确保数据的完整性和一致性。一般用于如下情况&#xff1a; 系统升级&#xff1a; 当企业需要更新其…

力扣(LeetCode)227. 基本计算器 II

给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意&#xff1a;不允许使用任何将字符串作为数学表达式计算的内置函数&#…

第二百八十九回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

三角函数、反三角函数

一、三角函数 二、反三角函数&#xff1a;已知三角函数值&#xff0c;反算角度大小 因为严格单调函数才有反函数一个y对应一个x&#xff0c;显然ysinx&#xff0c;ycosx&#xff0c;ytanx在其定义域并不是严格单调&#xff0c;所以需要人为划定范围。 1. 研究yarcsinx、yarcco…

CSS优先级内容

定义CSS样式时&#xff0c;经常出现两个或多个样式规则应用在同一元素的情况&#xff0c;这时就会出现优先级的情况&#xff0c;那么应用的元素应该显示哪一个样式呢&#xff1f; 一.下面举例对优先级进行具体讲解。 p{color:red;} .blue{color:orange;} #header{color:blu…

嵌入式学习-C++-Day3

嵌入式学习-CDay3 一、思维导图 二、作业 1.设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #inclu…

桌面型物联网智能机器人设计(预告)

相关资料 桌面级群控机器人CoCube探索-2022--CSDN博客 视频&#xff1a; 能&#xff01;有&#xff01;多&#xff01;酷&#xff01;CoCube桌面级群控机器人 让我看看谁在SJTU里划水… 简要介绍 设计一个桌面型物联网智能机器人&#xff0c;以ESP32芯片为核心&#xff0c;配…

Redis的SDS你了解吗?

初识SDS&#xff1a; Redis的String和其他很多编程语言中的语义相似&#xff0c;它能够表达3种值的类型&#xff1a; 1.字符串 2.整数 3.浮点数 三种类型根据具体场景由Redis完成相互之间的自动转换&#xff0c;并且根据需要选取底层的承载方式&#xff0c;Redis内部&#x…

pip 安装出现报错 SSLError(SSLError(“bad handshake

即使设置了清华源&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepip 安装包不能配置清华源&#xff0c;出现报错: Retrying (Retry(total2, connectNone, readNone, redirectNone, statusNone)) after connection broken by ‘SSLE…

redis为什么用单线程模型

redis为什么用单线程模型&#xff1f; 最近在深入研究redis&#xff0c;发现其中很多值得我们借鉴的思想&#xff0c;实现原理等&#xff0c;坚持每天学习一点点&#xff0c;不久就可成大佬&#xff0c;大家加油&#xff01; 言归正传&#xff0c;我来回答今天的问题&#xff…

[Python] 如何在Windows下安装图形可视化工具graphviz

什么是graphviz? Graphviz是一款开源的图形可视化工具&#xff0c;用于生成各种结构化数据的图形表示。它支持多种图形排列算法&#xff0c;可以将复杂的数据关系用图形的方式直观地展示出来。Graphviz广泛应用于软件工程、数据可视化、计算机网络以及其他领域的可视化分析中…

14 STM32标准库函数 之 实时时钟(RTC) 所有函数的介绍及使用

14 STM32标准库函数 之 实时时钟&#xff08;RTC&#xff09; 所有函数的介绍及使用 1 RTC的库函数预览1.1 函数RTC_ITConfig1.2 函数RTC_EnterConfigMode1.3 函数RTC_ExitConfigMode1.4 函数RTC_GetCounter1.5 函数RTC_SetCounter1.6 函数RTC_SetPrescaler1.7 函数RTC_ SetAla…

springboot131企业oa管理系统

企业OA管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足&#xff0c;创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管…

android 自定义键盘长按弹窗

自己记忆,下次不用找KeyboardView的onLongPress是长按监听,通过onLongPress可以获取键盘上用户长按的字母override fun onLongPress(popupKey: Keyboard.Key): Boolean {val label popupKey.labelif (!TextUtils.isEmpty(label) && popupKey.codes.get(0) ! MyKeyCode…

字符串相关的函数和内存块相关函数

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

python第五节:集合set(1)

集合是一个无序不重复元素的集合。集合中元素包含在花括号中&#xff0c;例如{a,1,tom,"xy"} 创建集合&#xff1a; 例子1&#xff1a; # set1 {a,1,tom,"xy"}set1 set()set2 set([])set3 set({})# 虽然集合用{}包含集合的元素&#xff0c;但是{}创…