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

详解C++作用域与生命周期

Pascal之父Nicklaus Wirth曾经提出一个公式展示出了程序的本质程序算法数据结构。后人又给出一个公式与之遥相呼应软件程序文档。这两个公式可以简洁明了的为我们展示程序和软件的组成。程序的运行过程可以理解为算法对数据的加工过程程序的运行的结果就是算法加工数据产生的结果数据。算法描述的是对数据加工的步骤对应于程序中的函数。数据结构描述的是数据在计算机中的组织结构对应于程序中的数据类型。程序中数据对应的就是无处不在变量。对于我们编程人员面对的无非就是函数数据类型和变量。因此C谈及作用域与生命周期针对的就是这三大程序的组成要素函数、数据类型和变量。下面将一一讲述。1.作用域与生命周期的区别作用域与生命周期是两个完全不同的概念。在英文中作用域用“scope”表示生命周期则用“duration”表示。作用域是一个静态概念只在编译源程序的时候用到。一个标识符的作用域指在源文件中该标识符能够独立地合法出现的区域。生命周期则是一个运行时Runtime概念它是指一个变量在整个程序从载入到结束运行的过程中存在的时间周期。由于函数和数据类型是静态的概念它们没有生命周期的说法它们从编译、程序的运行到结束整个过程是一直存在的。C中作用域的级别由高到低主要有文件域全局作用域、名字空间域、类域、函数作用域和代码块作用域其中函数作用域和代码块作用域又统称为局部域。2.函数的作用域函数分为类的成员函数和全局函数。类的成员函数作用域类域。生命周期无程序运行期一直存在。引用方法其他文件中要使用点操作符.或指针操作符-或作用域运算符::来引用。内存分布代码区。注意类成员函数可以定义在类体内即定义在头文件当类被不同源文件包含时不会报重定义的错误因为类体内实现的函数具有inline特性。举例如下12345678910111213141516//main.cppclasstest{private:inti;public:voidshow(){couti:iendl;}};intmain(intargc,char* argv[]){test t;t.show()}全局函数作用域文件域全局作用域。生命周期无程序运行期一直存在。引用方法其他文件中要先进行函数原型声明再使用。内存分布代码段。注意如果在两个源文件中定义了同名的全局函数连接时会出现重定义错误。举例如下123456789101112//function.cppvoidprintHello(){couthello worldendl;}//main.cppvoidprintHello();intmain(intargc,char* argv[]){printHello();}3.数据类型的作用域C中的数据类型分为基本数据类型和非基本数据类型非基本数据类型中又分为复合数据类型和构造数据类型。关于C中的数据类型详见本人另一篇blog: C数据类型。基本数据类型基本数据类型包括整型int、实型float和double、字符型char、布尔型bool和无值型void。作用域文件域全局作用域。生命周期无程序运行期一直存在。引用方法无需申明直接使用。内存分布代码段。复合数据类型复合数据类型包括数组type[]、指针type*、引用type、枚举enum。如果复合数据类型是构造数据类型参与的复合其作用域与构造数据类型一致。enum枚举类型的作用域与构造类型相同。构造数据类型作用域类型定义所在的域其他文件不可见。生命周期无程序运行期一直存在。引用方法其他文件中要先进行定义再通过作用域运算符进行使用。内存分布代码区。注意只要文件不互相包含如果在两个源文件中定义了同名的构造不会出现重定义错误因为数据类型不具有外部连接性。举例如下1234567891011121314151617181920//main.cppnamespacedd{classtest{private:inti;public:voidshow(){couti:iendl;}};}usingnamespacedd;//引用命名空间域中的构造类型test否则无法使用intmain(intargc,char* argv[]){test t;t.show();}4.变量的作用域与生命周期我们面对的变量主要分为全局变量、全局静态变量、局部变量和局部静态变量。下面一一讲述他们的作用域与生命周期。
http://www.rkmt.cn/news/1301426.html

相关文章:

  • DAE架构与Ember编译器优化嵌入操作性能
  • 量子优化算法在组合优化问题中的应用与基准测试
  • Adafruit支付升级Stripe集成:安全保存支付方式与快速结账指南
  • 基于温度感应的智能吊坠:从传感器到动画显示的嵌入式实践
  • 服务网格Istio实战
  • 成本优化策略:降低云资源支出
  • 云原生安全工具:保护云原生环境
  • 【2026最新】鸿蒙NEXT状态管理实战:培训班管理系统数据流转全攻略
  • 保姆级教程:在Ubuntu 22.04上用ROS2 Humble和MoveIt2玩转Panda机械臂(RViz可视化篇)
  • 对比自行搭建代理使用Taotoken聚合API在稳定性与成本上的实际感受
  • hoomanity项目解析:构建人性化AI交互的情感智能框架
  • 存内计算加速基因组测序碱基识别技术解析
  • 基于React的记忆管理UI组件库:openclaw-memory-ui实战指南
  • Arm Neoverse CMN-700互连架构与寄存器编程详解
  • 基于Go与Web技术的开源堡垒机OpenClaw Bastion部署与安全实践
  • EL电线手工制作发光蝴蝶结:从电致发光原理到可穿戴电子实践
  • 代码去重工具设计:从AST解析到语义指纹的工程实践
  • 关键词优化怎么理解最清楚
  • ARM Cortex-X1架构优化与性能调优实战
  • CircuitPython硬件编程入门:从Python到微控制器的核心实践
  • 轻量级配置中心核心架构解析:从设计原理到微服务实践
  • 通过curl命令直接测试Taotoken聊天接口的配置与排错方法
  • 分清redis主要数据操作中的key
  • 基于Next.js与next-pwa构建现代PWA应用:从模板到生产实践
  • AI技术在沉浸式音景创作中的应用与优化
  • 移动端Shell集成AI助手:ShellGPTMobile部署与实战指南
  • 如何在macOS上使用开源工具完整备份微信聊天记录:从数据提取到可视化浏览
  • iOS开发者如何构建高效技能集合:从工具收藏到工程实践
  • 压缩的本质:规律在几何上有形状,在代数上有结构
  • 紧急更新!Midjourney 6.2.1修复了铁银印相风格的gamma断层问题——但92%用户仍在用失效旧参数(附一键校验脚本)