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

发布时间:2026/5/17 4:59:25

详解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.变量的作用域与生命周期我们面对的变量主要分为全局变量、全局静态变量、局部变量和局部静态变量。下面一一讲述他们的作用域与生命周期。

相关新闻