六一的部落格


关关难过关关过,前路漫漫亦灿灿。



依据对象的生命周期, 对象可分为局部对象和全局对象, 局部对象又可分为自动对象和局部静态对象


对象的生命周期

在C++语言中,名字有作用域,对象有生命周期

名字的作用域是程序文本的一部分,名字在其中可见

对象的生命周期是程序执行过程中该对象存在的一段时间

块内定义的非静态对象的生命周期从它的定义开始,到定义所在的块末尾为止

程序启动后创建全局对象,程序控制流经过局部静态对象的定义时创建该局部静态对象

main函数结束时销毁全局对象和局部静态对象


全局对象

在所有函数体之外定义的对象, 存在于程序的整个执行过程中; 此类对象在程序启动时被创建,直到程序结束才会销毁


局部对象

定义在块中的对象;如形参和函数体内部定义的对象

仅在函数的作用域可见

隐藏外层作用域中同名的其他所有声明(不限于变量)

局部对象的生命周期依赖于定义的方式


自动对象

仅存在于函数执行过程中的对象

当程序的控制流经过此类对象的定义语句时,创建该对象; 当到达了定义所在的块的末尾时,销毁该对象

只存在于块执行期间的对象(函数块,各种块)

当块的执行结束后,块中创建的自动对象的值变成未定义


局部静态对象

其值在函数调用结束后仍然存在

在程序的执行路径第一次经过对象定义语句时初始化,直到程序终止才被销毁

未显式初始化,则进行值初始化

1size_t count_calls()
2{
3    static size_t ctr = 0;
4    return ++ctr;
5}

具有静态属性的对象

两种: 全局对象和局部静态对象

未显式初始化,则进行值初始化


值初始化

默认初始化的一种

内置类型被初始化为0

类类型的值初始化对其调用类的默认构造函数


发生值初始化的场景

  1. 定义具有静态属性的对象, 而没有给出初始值
  2. 对内置数组初始化时,列表中的元素个数小于数组大小,对剩余元素进行值初始化
  3. 初始化容器时,给出容器大小,对容器中所有的元素进行值初始化

自动对象

定义在块中的对象

定义时如果没有给出初值, 对对象进行默认初始化


默认初始化

对类类型对象调用默认构造函数, 内置类型对象拥有未定义初值


进行默认初始化的场景

  1. 在块作用域中定义对象但未给出初始值
  2. 定义一个内置数组时,默认初始化所有元素
  3. 未给出数据成员的类内初始值,也没有在初始值列表中对其进行初始化时,默认初始化该数据成员

对象的生命周期


依据对象的生命周期, 对象可分为局部对象和全局对象, 局部对象又可分为自动对象和局部静态对象


对象的生命周期

在C++语言中,名字有作用域,对象有生命周期

名字的作用域是程序文本的一部分,名字在其中可见

对象的生命周期是程序执行过程中该对象存在的一段时间

块内定义的非静态对象的生命周期从它的定义开始,到定义所在的块末尾为止

程序启动后创建全局对象,程序控制流经过局部静态对象的定义时创建该局部静态对象

main函数结束时销毁全局对象和局部静态对象


全局对象

在所有函数体之外定义的对象, 存在于程序的整个执行过程中; 此类对象在程序启动时被创建,直到程序结束才会销毁


局部对象

定义在块中的对象;如形参和函数体内部定义的对象

仅在函数的作用域可见

隐藏外层作用域中同名的其他所有声明(不限于变量)

局部对象的生命周期依赖于定义的方式


自动对象

仅存在于函数执行过程中的对象

当程序的控制流经过此类对象的定义语句时,创建该对象; 当到达了定义所在的块的末尾时,销毁该对象

只存在于块执行期间的对象(函数块,各种块)

当块的执行结束后,块中创建的自动对象的值变成未定义


局部静态对象

其值在函数调用结束后仍然存在

在程序的执行路径第一次经过对象定义语句时初始化,直到程序终止才被销毁

未显式初始化,则进行值初始化

1size_t count_calls()
2{
3    static size_t ctr = 0;
4    return ++ctr;
5}

具有静态属性的对象

两种: 全局对象和局部静态对象

未显式初始化,则进行值初始化


值初始化

默认初始化的一种

内置类型被初始化为0

类类型的值初始化对其调用类的默认构造函数


发生值初始化的场景

  1. 定义具有静态属性的对象, 而没有给出初始值
  2. 对内置数组初始化时,列表中的元素个数小于数组大小,对剩余元素进行值初始化
  3. 初始化容器时,给出容器大小,对容器中所有的元素进行值初始化

自动对象

定义在块中的对象

定义时如果没有给出初值, 对对象进行默认初始化


默认初始化

对类类型对象调用默认构造函数, 内置类型对象拥有未定义初值


进行默认初始化的场景

  1. 在块作用域中定义对象但未给出初始值
  2. 定义一个内置数组时,默认初始化所有元素
  3. 未给出数据成员的类内初始值,也没有在初始值列表中对其进行初始化时,默认初始化该数据成员