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;
    }
相关推荐
十五年专注C++开发14 天前
全面深入了解C++20 范围库(std::ranges)
c++20·管道·哨兵·视图·ranges
小小龙学IT17 天前
C++20 协程深度解析:从原理到高性能异步框架实战
junit·c++20
楼田莉子21 天前
C++20新特性:协程
开发语言·c++·后端·学习·c++20
ouliten24 天前
C++笔记:C++20风格线程池
c++·笔记·c++20
眠りたいです25 天前
现代C++:C++17中的新库特性
开发语言·c++·c++20·c++17
楼田莉子1 个月前
C++20新特性:Range库
开发语言·c++·后端·学习·c++20
楼田莉子1 个月前
C++20现代特性:概念与约束
开发语言·c++·后端·学习·c++20
aluluka1 个月前
C++ 20 协程的探索
c++·c++20
君鼎1 个月前
内存池完整实现——C++20版
c++20·内存池
普通网友1 个月前
记录我适配iOS26遇到的一些问题
c++20