静态对象(全局+局部+静态对象成员)

2023-11-13

所有的静态对象、全局对象都于静态存储区分配。关于全局对象,是在main()函数执行前就分配好了的。其实,在main()函数中的显示代码执行之前,会调用一个由编译器生成的_main()函数,而_main()函数会进行所有全局对象的的构造及初始化工作。而在main()函数结束之前,会调用由编译器生成的exit函数,来释放所有的全局对象。比如下面的代码:

void main(void)

{

 … …// 显式代码

}

  实际上,被转化成这样:

void main(void)

{

 _main(); //隐式代码,由编译器产生,用以构造所有全局对象

 … … // 显式代码

 … …

 exit() ; // 隐式代码,由编译器产生,用以释放所有全局对象

}

  所以,知道了这个之后,便可以由此引出一些技巧,如,假设我们要在main()函数执行之前做某些准备工作,那么我们可以将这些准备工作写到一个自定义的全局对象的构造函数中,这样,在main()函数的显式代码执行之前,这个全局对象的构造函数会被调用,执行预期的动作,这样就达到了我们的目的。 刚才讲的是静态存储区中的全局对象,那么,局部静态对象了?局部静态对象通常也是在函数中定义的,就像栈对象一样,只不过,其前面多了个static关键字。局部静态对象的生命期是从其所在函数第一次被调用,更确切地说,是当第一次执行到该静态对象的声明代码时,产生该静态局部对象,直到整个程序结束时,才销毁该对象。

  还有一种静态对象,那就是它作为class的静态成员。考虑这种情况时,就牵涉了一些较复杂的问题。

  第一个问题是class的静态成员对象的生命期,class的静态成员对象随着第一个class object的产生而产生,在整个程序结束时消亡。也就是有这样的情况存在,在程序中我们定义了一个class,该类中有一个静态对象作为成员,但是在程序执行过程中,如果我们没有创建任何一个该class object,那么也就不会产生该class所包含的那个静态对象。还有,如果创建了多个class object,那么所有这些object都共享那个静态对象成员。

  第二个问题是,当出现下列情况时:

 class Base

{

 public:

  static Type s_object ;

}

class Derived1 : public Base / / 公共继承

{

 … …// other data

}

class Derived2 : public Base / / 公共继承

{

 … …// other data

}

Base example ;

Derivde1 example1 ;

Derivde2 example2 ;

example.s_object = …… ;

example1.s_object = …… ;

example2.s_object = …… ; 

  请注意上面标为黑体的三条语句,它们所访问的s_object是同一个对象吗?答案是肯定的,它们的确是指向同一个对象,这听起来不像是真的,是吗?但这是事实,你可以自己写段简单的代码验证一下。我要做的是来解释为什么会这样? 我们知道,当一个类比如Derived1,从另一个类比如Base继承时,那么,可以看作一个Derived1对象中含有一个Base型的对象,这就是一个subobject。一个Derived1对象的大致内存布局如下:

  

  让我们想想,当我们将一个Derived1型的对象传给一个接受非引用Base型参数的函数时会发生切割,那么是怎么切割的呢?相信现在你已经知道了,那就是仅仅取出了Derived1型的对象中的subobject,而忽略了所有Derived1自定义的其它数据成员,然后将这个subobject传递给函数(实际上,函数中使用的是这个subobject的拷贝)。

  所有继承Base类的派生类的对象都含有一个Base型的subobject(这是能用Base型指针指向一个Derived1对象的关键所在,自然也是多态的关键了),而所有的subobject和所有Base型的对象都共用同一个s_object对象,自然,从Base类派生的整个继承体系中的类的实例都会共用同一个s_object对象了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态对象(全局+局部+静态对象成员) 的相关文章

  • 数学建模课程

    数学规划模型 2020 3 7 1 数学规划 简称最优化问题 2 最优化问题的数学模式的一般形式 三个要素 决策变量 目标函数 约束条件 所确定的x的范围为 可行域 满足 2 的解 可行解 同时满足 1 2 最优解 整个可行域上 全局最优解
  • TensorFlow2.x,GPU代码测试

    TensorFlow2 x GPU代码测试 代码如下 import tensorflow as tf import os os environ TF CPP MIN LOG LEVEL 2 不显示等级2以下的提示信息 print GPU t
  • 测试开发工程师需要掌握什么技能?

    如何理解测试开发 有人问测试开发是测试还是开发 本质上来说 还是测试 因为测试是核心 开发是手段 那么说 成为测试开发 需要那些必备的技能呢 不同level的测试工程师应具备的基本技能第一个 我们称之为测试员 测试工程师 直白一点说 就是干
  • pandas学习笔记(三)---重建索引与处理缺失值

    本文介绍pandas中重建索引与处理缺失值 文章目录 一 重建索引 1 1series重建索引 1 2 dataframe重建索引并修改缺失值 二 处理缺失值 2 1丢掉含有缺失值的行或者列 2 2 填充缺失值 2 3判断df中每个元素是否
  • QT设置背景图片的3种方式 & 区别——设置样式表styleSheet

    方式1 修改MainWindow主窗口 的 styleSheet 1 效果图 工具栏和状态栏 也加了背景 参考链接https blog csdn net mozai147 article details 84112744 2 选中编辑Mai
  • Angular学习笔记69:Angular项目的单元测试 -- 对服务进行测试

    对服务进行测试 服务通常是单元测试中最简单的文件类型 对于简单 没有其他依赖的服务 对于一个没有其他依赖的服务 Mock 一些数据 进行测试即可 例如 对于一个公共数据处理的服务 import Injectable from angular
  • mysql——锁

    三种锁问题 1 丢失修改 火车票问题 让第一个人丢失了修改 2 不可重复读 幻象 第二次读会读到不正确的数据 一个事务读到另一个已提交的事务 3 读 脏 数据 A修改值后又回滚 B读到修改后的值 即脏数据 或者是一个事务读到了另一个事务未提
  • office版本比较

    office LTSC 2021 专业增强版就是简化版的永久版的OFFICE 365罢了 建议还是装365划算 装的什么版本无所谓 激活的时候用的什么许可证才是决定你使用时版本的最终因素 比如装的 office 2021 最后用的2016的
  • ibm多服务器共用显示模块连接,IBM WebSphere 应用服务器多个模块跨站脚本漏洞

    IBM WebSphere 应用服务器多个模块跨站脚本漏洞 受影响系统 IBM Websphere Application Server 7 0 IBM Websphere Application Server 6 1 不受影响系统 IBM
  • 百度地图API取消点击景点弹出框

    有时候我们自己在地图上添加的标注会跟百度地图上面的景点商家标注重合 点击的时候就会弹出景点弹窗 就像这样 我们正常在创建地图的时候都是 var map new BMap Map allmap 创建Map实例 想要禁用百度地图景点弹窗需要添加
  • unity3d 学习笔记_____Native2d 刚体、碰撞器、关节的使用

    Mass Mass of the rigidbody Linear Drag Drag coefficient affecting positional movement Angular Drag Drag coefficient affe
  • [C语言】多种方法求2的n次方

    方法一 循环法 不断地乘以2 循环i次 int main int a i c 1 注意要初始化为1而不是0 scanf d i for a 1 a lt i a c c 2 printf d c return 0 方法二 左移法 一个数它左
  • unity 移动物体到指定位置的四种方法

    方法1 使用Vector3 MoveTowards void Update float step speed Time deltaTime gameObject transform localPosition Vector3 MoveTow
  • intellij idea远程调试

    前景 1 有些时候 调试不得不用外网 比如说做支付宝的支付接口 服务器后台通 知就不得不用外网的ip 无奈 只能扔到服务器远程调试了 2 java后台和app结合开发 app测试出了一些问题 又比较难重现 那么这个时候远程调试就可以派上用场
  • IP地址分类和数据包传输过程用到的协议

    ip地址分类 单播地址 A 0XXX XXXX 0 127 1 126 B10XX XXXX 128 191 C110X XXXX 192 223 组播地址 D1110 XXXX 224 255 私有地址 E1111 XXXX 240 25
  • 生产者与消费者模式(线程的同步与互斥)

    条件变量 条件变量的提出首先要涉及一个概念 就是生产者消费者模型 生产者消费者 是在多线程同步的一个问题 两个固定大小缓冲区的线程 在实际运行是会发生问题 生产者是生成数据放入缓冲区 重复过程 消费者在缓冲区取走数据 生产者消费者的模型提出
  • adapterview android,AdapterView

    AdapterView 版本 Android 2 3 r1 结构 继承关系 public abstract class AdapterView extends ViewGroup java lang Object android view
  • QT构建好的exe在指定目录运行出现找不到dll或者定位不到程序入口点解决方法

    win10系统的话打开这台电脑 然后再系统环境变量中将D QtEnvironment 5 12 3 mingw73 32 bin添加到Path中 并且上移 解决Qt生成exe错误 无法定位程序输入点
  • 五种方法解除开机密码

    5种方法解除开机密码 教你怎样解除电脑开机密码 先记下来 以后总会有用到的 此方法仅供计算机教师交流 严禁作为非法手段使用
  • 生成项目目录树

    写项目设计文档或者在写新项目的README md文件时 都需要展示项目的一些重要的目录结构 其实可以通过安装brew等方法来进行 但是推荐一个插件 vscode中下载插件tree generator 安装完成后打开需要生成的目录结构树的项目

随机推荐

  • 深度学习(6):图像超分辨率(Image Super Resolution)重建

    目标 使用深度学习技术对图像进行超分辨率重建 涉及到的技术包括卷积神经网络 生成对抗网络 残差网络等 技术 本实验使用到 Jupyter Notebook 等开发组件 涉及到了 TensorFlow NumPy scipy misc PIL
  • LeetCode160-------相交链表(java)

    题目中文链接 编写一个程序 找到两个单链表相交的起始节点 例如 下面的两个链表 节点 c1 开始相交 注意 如果两个链表没有交点 返回 null 在返回结果后 两个链表仍须保持原有的结构 可假定整个链表结构中没有循环 程序尽量满足 O n
  • 有哪些期货交易理念(期货交易的概念及主要特征)

    在期货和股票市场里面 什么是交易理念 所谓交易理念 我认为就是你所认为的构建你交易策略的基础 是制定交易系统的逻辑基础 比如 你觉得现在是涨势 那么在回调的时候做多 是一种交易理念 跌势 反弹放空是一种交易理念 震荡市 震荡区间下不开多 上
  • 斐讯r1换网络_新房装修网络布线方案二:客厅电视柜放单个路由器覆盖全屋

    继续研讨新房装修的家庭网络搭建的问题 我昨天推荐的是一个AC AP的方案 如果是小户型 对网络这块要求并不高 比如 并不要求全屋都5G覆盖满的 基于成本考虑 可以先不上AC AP 先用一个性能稍好的千兆路由器 比如 斐讯的K2p 网件R70
  • WinDbg Command-Line Options

    First time users of WinDbg should begin with the Debugger Operation section The WinDbg command line uses the following s
  • SQL注入点判断及注入方式

    SQL注入类型 一 判断注入点 当参数可控时 看参数是否对数据产生影响 若有影响则可能是注入点 输入SQL看是否可以产生报错 通过报错信息得到数据库部分语句 利用引号 双引号 圆括号进行报对 二 注入方式 get注入 在get传参时写入参数
  • 简便快捷 解决burp suite不能抓本地包的问题

    v 解决burp suite不能抓本地包的问题 蛋黄小课堂开课啦 蛋黄碎碎念 第一次遇到不能抓本地包的时候 通过百度找到用本机实际IP地址替代 127 0 0 1 的方法可以解决不能抓本地包的问题 但是后来又不行了 于是再百度 找了好久 最
  • 伪似然估计(Pseudo Maximum Likelihood Estimation)

    伪似然估计 和 剖面似然估计 伪似然估计 参考文献 Gong G and Samaniego F J 1981 pseudo Maximum Likelihood Estimation Theory and Applications The
  • 属性layout_weight不起作用的解决方法

    在使用线性布局的时候 使用layout weight属性来达到控件自适应屏幕宽度的效果 但是有的时候这个属性没有起作用 这个时候就需要仔细检查一下 1 只有LinearLayout标签支持 2 设置layout weight时要根据布局的方
  • SSM实战项目——Java高并发秒杀API

    SSM实战项目 Java高并发秒杀API 项目截图 秒杀列表 秒杀详情页 错误提示 开始秒杀 秒杀成功 重复秒杀 秒杀倒计时 秒杀结束 项目介绍 何为秒杀 所谓 秒杀 就是网络卖家发布一些超低价格的商品 所有买家在同一时间网上抢购的一种销售
  • c++智能指针

    智能指针是一种用于管理动态分配的内存的工具 它可以自动地不再需要时释放内存 智能指针目的 避免内存泄漏和释放已经释放的内存 用法 会在堆上分配内存 并在不再需要时自动释放 通常会跟踪指向堆上对象的引用计数 并在引用计数为0时自动释放内存
  • linux软连接显示broken link

    解决方案 sudo ln s 源文件 目标文件 注 两者必须为绝对路径
  • 关于测试用例

    测试专栏 软件测试的基本概念 关于软件测试 作为一个测试人员 这些基础知识必不可少 目录 一 测试用例的基本要素 1 什么是测试用例 2 为什么软件测试人员要写测试用例 二 测试用例的设计方法 1 基于需求设计测试用例 2 具体设计测试用例
  • docker制作镜像,导出导入本地镜像等初级指南

    首先安装 docker 1 prepare 更改 yum 源加快安装环境 添加下面 yum 源 docker ce stable name Docker CE Stable basearch baseurl https mirrors al
  • 当绘图遇上Caché之元数据代理

    很久以前到沈阳实习的时候还一个个问度娘C 画图 画了电路图绘制软件的毕业设计 雪花屏保等等 搞LIS软件后绘制各种仪器图 对C 画笔 画字符串 画线 画圆等等耳熟能详 然而却碰到一个问题 我们的仪器大部分是盒子用数据库M连接的 如果盒子仪器
  • micropython RX8025T 驱动简单演示

    我就知道可能八百年会有一位大哥来找这个驱动 让我来猜猜为啥用这个 嫌一般的RTC不够精准是吧 想用个带温度补偿的试试 代码拿去 其实巨简单的 没啥好说的 而且只有基本功能 from micropython import const impo
  • 容器的docker-compose怎样写agent.jar配置

    在 Docker Compose 文件中配置 Java Agent 例如 agent jar 的方式与之前的环境变量类似 您可以使用 environment 字段来设置 Java 环境变量 包括 javaagent 参数来指定 Java A
  • 【C++】string使用

    文章目录 1 为什么要学习string类 2 标准库中的string类 2 1了解string类 2 2string类常用的接口 2 2 1 构造和析构相关 2 2 2 迭代器 2 2 3 容量相关 2 2 4 元素访问 元素遍历 元素访问
  • 生命在于学习——未授权访问漏洞

    声明 本篇文章只是用于记载学习笔记 学习交流 不可用作其他违规用途 一 简介 未授权访问可以理解为需要安全配置或权限认证的地址 授权页面存在缺陷 导致其他用户可以直接访问 从而引发重要权限可被操作 数据库 网站目录等敏感信息泄露 目前主要存
  • 静态对象(全局+局部+静态对象成员)

    所有的静态对象 全局对象都于静态存储区分配 关于全局对象 是在main 函数执行前就分配好了的 其实 在main 函数中的显示代码执行之前 会调用一个由编译器生成的 main 函数 而 main 函数会进行所有全局对象的的构造及初始化工作