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

C++ 对象构造语义学——局部对象、全局对象的构造和析构

局部对象、全局对象的构造和析构

局部对象、全局对象的构造和析构

    • 局部对象、全局对象的构造和析构
      • 1. 局部对象的构造和析构
        • 示例代码
      • 2. 全局对象的构造和析构
        • 理解要点
        • 示例代码
      • 3. 实际应用中的考虑
      • 总结

1. 局部对象的构造和析构

  • 构造

    • 局部对象在其作用域内创建时,会自动调用构造函数。这一过程确保对象在使用前被正确初始化。
    • 在函数内部创建的对象,其生命周期仅限于该函数的执行。
  • 析构

    • 当局部对象的作用域结束时,编译器会自动插入代码调用对象的析构函数,从而确保资源的有效释放。
    • 局部对象的析构函数在其作用域结束时被自动调用。
  • 成员变量初始化

    • 当创建一个类的对象时,成员变量(如 m_i)的初始值是随机的。
    • 局部对象的成员变量在创建时并不会自动初始化,若未显式赋值,其值将是未定义的。
    • 为了确保对象的稳定性和可预测性,程序员应在构造函数的初始化列表或构造函数体内为其显式赋值。
示例代码
#include <iostream>class MyClass {
public:int m_i;MyClass() : m_i(0) { // 为 m_i 赋初值std::cout << "构造函数被调用,m_i = " << m_i << std::endl;}~MyClass() {std::cout << "析构函数被调用" << std::endl;}
};void function() {MyClass localObj; // 局部对象// localObj 的析构函数会在作用域结束时被调用
}int main() {function(); // 调用函数return 0;
}

2. 全局对象的构造和析构

  • 构造

    • 全局对象在程序启动时创建,其构造函数在 main 准备执行之前被调用。
    • 全局对象在整个程序运行期间始终可用,适合需要在多个函数间共享的资源。
  • 析构

    • 全局对象在程序结束时销毁,其析构函数在 main 执行完毕后被调用。
  • 成员变量初始化

    • 全局对象的成员变量(如数值类型)如果没有显式赋值,编译器会默认初始化为0,这与局部对象不同。
理解要点
  1. 程序执行流程
    • 程序在进入 main 函数之前以及执行完 main 函数之后会进行许多其他操作。程序并不只是从 main 开始执行,也并不在返回 main 后立即结束。
  2. 编译器插入的代码
    • 编译器会在程序中插入代码以处理全局对象的静态初始化和析构。例如,在 main 开始前会调用全局对象的构造函数,在 main 结束后会调用析构函数。
示例代码
#include <iostream>class MyClass {
public:int m_i;MyClass() : m_i(0) { // 全局对象的成员变量初始化为0std::cout << "全局对象构造函数被调用,m_i = " << m_i << std::endl;}~MyClass() {std::cout << "全局对象析构函数被调用" << std::endl;}
};MyClass globalObj; // 全局对象int main() {std::cout << "进入 main 函数" << std::endl;return 0;
}

3. 实际应用中的考虑

在实际开发中,选择使用局部对象还是全局对象取决于具体需求:

  • 局部对象:适合于临时使用的资源,能够有效地控制资源的生命周期,避免全局状态带来的复杂性。
  • 全局对象:适合于需要在多个函数间共享的资源,但使用不当可能导致意想不到的副作用,如全局状态的变化影响程序的其他部分。

总结

  • 局部对象:在作用域内构造和析构,成员变量需显式初始化。
  • 全局对象:在程序启动和结束时构造和析构,成员变量默认初始化为0。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MINIO图片地址浏览器打开不显示
  • python中的列表、元组、字典之间的区别
  • 刑法学学习笔记(个人向) Part.1
  • haproxy 7000字配图超详细教程 从小白到入门
  • docker知识点
  • https://ffmpeg.org/
  • 专业技能(挖坑填坑)——MYSQL的索引、日志、事务、存储引擎、锁机制等相关原理
  • JVM垃圾回收算法有哪些
  • javaer快速入门 goweb框架 gin
  • 机械行业数字化生产供应链产品解决方案(十六)
  • 深度学习------------------卷积神经网络(LeNet)
  • 学习记录第二十八天
  • 中国软件评测中心:2024年最新人工智能大语言模型技术发展研究报告 (附文档)
  • SQL— DDL语句学习【后端 10】
  • 单一职责原则入门:如何编写更清晰、更可维护的代码
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • Asm.js的简单介绍
  • iOS编译提示和导航提示
  • Java教程_软件开发基础
  • SAP云平台里Global Account和Sub Account的关系
  • tensorflow学习笔记3——MNIST应用篇
  • Zsh 开发指南(第十四篇 文件读写)
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 基于axios的vue插件,让http请求更简单
  • 使用common-codec进行md5加密
  • 使用SAX解析XML
  • 微信开源mars源码分析1—上层samples分析
  • 学习笔记TF060:图像语音结合,看图说话
  • 最近的计划
  • 积累各种好的链接
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # wps必须要登录激活才能使用吗?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (k8s)Kubernetes本地存储接入
  • (二)springcloud实战之config配置中心
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (每日一问)基础知识:堆与栈的区别
  • (七)Activiti-modeler中文支持
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (转)ABI是什么
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)大道至简,职场上做人做事做管理
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .gitignore文件—git忽略文件
  • .net core docker部署教程和细节问题
  • .Net MVC4 上传大文件,并保存表单
  • .NET/C# 使窗口永不获得焦点
  • .net程序集学习心得
  • .NET应用架构设计:原则、模式与实践 目录预览