C++20的指定初始化器(Designated Initializers)

举报
码事漫谈 发表于 2025/02/27 19:50:09 2025/02/27
【摘要】 指定初始化器的使用条件 语法 嵌套结构体的初始化 数组的指定初始化 注意事项 优势C++20引入了**指定初始化器(Designated Initializers)**这一特性,允许在初始化结构体、联合体或类的对象时,明确指定成员变量的初始化值,而无需按照成员的声明顺序进行初始化。这一特性特别适用于大型或复杂的结构体,能够提高代码的可读性和灵活性。 指定初始化器的使用条件指定初始化器只能用...

C++20引入了**指定初始化器(Designated Initializers)**这一特性,允许在初始化结构体、联合体或类的对象时,明确指定成员变量的初始化值,而无需按照成员的声明顺序进行初始化。这一特性特别适用于大型或复杂的结构体,能够提高代码的可读性和灵活性。

指定初始化器的使用条件

指定初始化器只能用于聚合类型(Aggregate Types),这意味着:

  1. 类型不能有自定义构造函数。
  2. 所有成员变量必须是公开的(public)。
  3. 类型不能有基类或虚函数。

语法

指定初始化器的语法如下:

T object = { .member1 = value1, .member2 = value2, ... };

例如:

struct Point {
    int x;
    int y;
    int z;
};

Point p{.y = 99, .x = 66};  // 显式初始化x和y,z默认初始化为0

嵌套结构体的初始化

指定初始化器也支持嵌套结构体的初始化。例如:

struct Point {
    int x;
    int y;
    int z;
};

struct Color {
    int r;
    int g;
    int b;
};

struct ComplexPoint {
    Point pt;
    Color color;
};

ComplexPoint cp{
    .pt = {.x = 66, .y = 99, .z = 100},
    .color = {.r = 255, .g = 0, .b = 0}
};

数组的指定初始化

除了结构体,C++20还支持使用指定初始化器初始化数组的特定元素:

int arr[3] = {[0] = 66, [2] = 99};  // arr[1]将被隐式初始化为0

注意事项

  1. 指定初始化器的顺序必须与成员变量的声明顺序一致。
  2. 未明确指定的成员将进行默认初始化。
  3. 指定初始化器不能与非指定初始化混合使用。
  4. 指定初始化器不支持收缩转换(narrowing conversion)。

优势

指定初始化器的主要优势包括:

  • 提高代码可读性:明确指定每个成员的初始值,避免因成员顺序错误导致的问题。
  • 灵活性:允许只初始化部分成员,其余成员自动进行默认初始化。
  • 安全性:减少因初始化顺序不一致而导致的潜在错误。

指定初始化器是C++20中一个非常实用的特性,特别适合处理复杂的聚合类型初始化。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。