类的变量的初始化:成员初始化列表、就地初始化

类的变量的初始化分为成员初始化列表、就地初始化。

成员初始化列表是C++中构造函数的一部分,它允许你在进入构造函数体之前为类的成员变量提供初始值。成员初始化列表紧跟在构造函数的参数列表之后,由冒号 : 开始,然后是一系列以逗号分隔的初始化项。

就地初始化(也称为成员初始器或直接初始化)是指在类或结构体的成员变量声明时直接给它们赋初值。

就地初始化(也称为成员初始器或直接初始化)是在对象创建时发生的,它在构造函数体执行之前就已经完成了。具体来说,在C++中,成员变量的初始化遵循以下顺序:

  1. 成员初始化列表:如果构造函数使用了成员初始化列表,那么这些成员会按照它们在类中声明的顺序进行初始化,而不是按照初始化列表中的顺序。

  2. 就地初始化:对于那些没有在成员初始化列表中显式初始化的成员变量,如果它们已经在声明时进行了就地初始化,那么它们会在构造函数体执行之前被赋予这些默认值。

  3. 构造函数体:最后,构造函数体内的代码会被执行。

因此,可以这样理解就地初始化的过程:

  • 当一个对象被创建时,编译器首先检查每个成员变量是否在构造函数的成员初始化列表中有对应的初始化。
  • 如果某个成员变量没有出现在成员初始化列表中,但已经定义了就地初始化,则该成员变量会被赋予就地初始化提供的值。
  • 所有成员变量初始化完成后,才会开始执行构造函数体内的语句。

举个例子,假设有一个结构体如下:

cpp 复制代码
struct Example
{
    int a = 42; // 就地初始化
    std::string b; // 没有就地初始化

    Example(int x) : b("Hello") // 成员初始化列表
    {
        // 构造函数体
    }
};

在这个例子中,Example 对象的创建过程如下:

  1. a 被就地初始化为 42
  2. b 在成员初始化列表中被初始化为 "Hello"
  3. 然后构造函数体被执行。

所以,就地初始化发生在构造函数体执行之前,并且是按照成员变量在类中声明的顺序来完成的。如果成员变量也在成员初始化列表中被初始化,那么成员初始化列表中的初始化将覆盖就地初始化。

相关推荐
Murphy_lx10 分钟前
Lambda表达式
开发语言·c++
yangpipi-18 分钟前
C++并发编程-23. 线程间切分任务的方法
开发语言·c++
楼田莉子1 小时前
C++算法专题学习——分治
数据结构·c++·学习·算法·leetcode·排序算法
ulias2122 小时前
各种背包问题简述
数据结构·c++·算法·动态规划
程序喵大人2 小时前
分享个C++线程池的实现源码
开发语言·c++·线程池
FL16238631293 小时前
[ubuntu][C++]onnxruntime安装cpu版本后测试代码
linux·c++·ubuntu
要做朋鱼燕3 小时前
【C++】 priority_queue 容器模拟实现解析
开发语言·c++·笔记·职场和发展
励志不掉头发的内向程序员3 小时前
C++进阶——继承 (1)
开发语言·c++·学习
mit6.8245 小时前
并查集|栈
c++
中国胖子风清扬5 小时前
Rust 序列化技术全解析:从基础到实战
开发语言·c++·spring boot·vscode·后端·中间件·rust