对象的生命周期
2023年12月14日 2023年12月29日
依据对象的生命周期, 对象可分为局部对象和全局对象, 局部对象又可分为自动对象和局部静态对象
对象的生命周期
在C++语言中,名字有作用域,对象有生命周期
名字的作用域是程序文本的一部分,名字在其中可见
对象的生命周期是程序执行过程中该对象存在的一段时间
块内定义的非静态对象的生命周期从它的定义开始,到定义所在的块末尾为止
程序启动后创建全局对象,程序控制流经过局部静态对象的定义时创建该局部静态对象
main函数结束时销毁全局对象和局部静态对象
全局对象
在所有函数体之外定义的对象, 存在于程序的整个执行过程中; 此类对象在程序启动时被创建,直到程序结束才会销毁
局部对象
定义在块中的对象;如形参和函数体内部定义的对象
仅在函数的作用域可见
隐藏外层作用域中同名的其他所有声明(不限于变量)
局部对象的生命周期依赖于定义的方式
自动对象
仅存在于函数执行过程中的对象
当程序的控制流经过此类对象的定义语句时,创建该对象; 当到达了定义所在的块的末尾时,销毁该对象
只存在于块执行期间的对象(函数块,各种块)
当块的执行结束后,块中创建的自动对象的值变成未定义
局部静态对象
其值在函数调用结束后仍然存在
在程序的执行路径第一次经过对象定义语句时初始化,直到程序终止才被销毁
未显式初始化,则进行值初始化
1size_t count_calls() 2{ 3 static size_t ctr = 0; 4 return ++ctr; 5}
具有静态属性的对象
两种: 全局对象和局部静态对象
未显式初始化,则进行值初始化
值初始化
默认初始化的一种
内置类型被初始化为0
类类型的值初始化对其调用类的默认构造函数
发生值初始化的场景
- 定义具有静态属性的对象, 而没有给出初始值
- 对内置数组初始化时,列表中的元素个数小于数组大小,对剩余元素进行值初始化
- 初始化容器时,给出容器大小,对容器中所有的元素进行值初始化
自动对象
定义在块中的对象
定义时如果没有给出初值, 对对象进行默认初始化
默认初始化
对类类型对象调用默认构造函数, 内置类型对象拥有未定义初值
进行默认初始化的场景
- 在块作用域中定义对象但未给出初始值
- 定义一个内置数组时,默认初始化所有元素
- 未给出数据成员的类内初始值,也没有在初始值列表中对其进行初始化时,默认初始化该数据成员