C++20新特性_指定初始化 (Designated Initializers)

文章目录

  • [第一章 C++20核心语法特性](#第一章 C++20核心语法特性)
    • [1.6 指定初始化 (Designated Initializers)](#1.6 指定初始化 (Designated Initializers))
      • [1.6.1 语法规则](#1.6.1 语法规则)
      • [1.6.2 示例](#1.6.2 示例)

本文记录C++20新特性之指定初始化 (Designated Initializers)。

第一章 C++20核心语法特性

1.6 指定初始化 (Designated Initializers)

C++20之前,初始化一个包含多个成员的结构体通常使用{}方式,按值的定义顺序进行初始化。

cpp 复制代码
    struct Window {
        int x, y;
        int width, height;
        bool isVisible;
        const char* title;
    };

    void test()
    {
        // C++20 之前:必须严格按照定义顺序,且容易混淆
        Window w = { 10, 10, 800, 600, true, "Main" };
    }

这种方式缺点是可读性差,看到10,800,需要对照定义顺序来查看表示的意思。

如果在结构体中添加或删除一个成员,所有初始化代码都要重新修改。

C++20引入了指定初始化,解决了上面的问题。

1.6.1 语法规则

cpp 复制代码
.成员名 = 值。

比如:

cpp 复制代码
Window w = { .x = 10, .y = 10, .title = "Main" };
复制代码
需要注意:
  • 按顺序指定,指定成员顺序必须与结构体成员定义顺序一致。
  • 未指定的成员将使用默认的初始化值。
  • 不能混用,不能又指定初始化,又普通初始化,例如 { .x = 1, 20 } 是非法的。

1.6.2 示例

示例1:C++20初始化

cpp 复制代码
    struct Date {
        int year;
        int month;
        int day;
    };

    void printDate(const Date& d)
    {
        std::cout << d.year << "-" << d.month << "-" << d.day << std::endl;
    }

    void test()
    {
        // 之前写法
		Date d1 = { 2025, 6, 15 };
        printDate(d1);
        // 2025-6-15
        // C++20 写法
        Date d2 = {
            .year = 2025,
            .month = 6,
            .day = 2
        };
		printDate(d2);
        // 2025-6-2
    }

示例2:初始化指定的成员

cpp 复制代码
    struct ServerConfig {
        int port = 8080;           // 默认值
        int max_connections = 100; // 默认值
        bool enable_ssl = false;   // 默认值
        const char* name = "Default";
    };

    int test()
    {
        // 场景 1: 只修改端口,其他用默认值
        ServerConfig c1 = { .port = 9090 };
        // c1.max_connections 是 100, c1.enable_ssl 是 false

        // 场景 2: 只开启 SSL,其他用默认值
        // 注意:必须跳过前面的成员,不能乱序
        ServerConfig c2 = { .enable_ssl = true };

        // 场景 3: 错误示范 (乱序)
        // ServerConfig c3 = { .enable_ssl = true, .port = 80 }; // 编译错误!port 定义在 enable_ssl 之前

        return 0;
    }

示例3:联合体 (Union) 的初始化

cpp 复制代码
    union Value {
        int i;
        float f;
        char c;
    };

    int test() {
        // C++20 之前:只能 Value v = { 10 }; (初始化 i)

        // C++20:可以直接初始化 f
        Value v = { .f = 3.14f };

        return 0;
    }
相关推荐
啦啦啦啦啦zzzz8 天前
利用RAII机制进行日志的采集
linux·服务器·c++·网络编程·c++20
啦啦啦啦啦zzzz9 天前
Logger的组装(c++20)
c++·算法·c++20
啦啦啦啦啦zzzz11 天前
Appender抽象类的实现c++20
linux·服务器·c++·c++20
OPEN-F14 天前
C++20新特性精讲:概念、范围与三路比较
算法·c++20
小小龙学IT22 天前
C++ std::chrono 时间库深度解析:从 duration 模板到 C++20 日历与时区
linux·c++·c++20
郝学胜-神的一滴24 天前
C++20 高级编程 004:从初始化、内存到const系列关键字
开发语言·算法·编程·软件构建·c++20
可爱系程序猿25 天前
msvcp120.dll 加载失败排查:VC++ 2013、进程架构与插件私有目录如何对应
程序人生·电脑·c++20
ShineWinsu25 天前
对于C++:C++20中线程、初始化、Lambda与内存视图等特性的解析
c++·c++20
可爱系程序猿25 天前
mfc100.dll 加载失败排查:旧版 VC++ 2010 程序、位数与插件目录如何核对
程序人生·电脑·c++20
ShineWinsu1 个月前
对于 C++:C++20中Concept(概念) 与 Coroutine(协程)的解析
linux·开发语言·网络·c++·c++20·epoll