当前位置: 首页 > news >正文

c++基础·列表初始化

目录

 一、列表初始化的核心优势

二、基础数据类型与数组初始化

1. 基础类型初始化

2. 数组初始化

三、类与结构体初始化

1. 构造函数匹配规则

2. 注意事项

四、标准容器初始化

五、聚合类型(Aggregate Types)初始化

1. 聚合类型定义

2. 初始化规则

六、总结与实践建议

最佳实践

性能提示

拓:聚合类型条件解析:"无私有或保护的非静态成员"

1. 聚合类型定义条件表格

2. 关键概念解释


 一、列表初始化的核心优势

        列表初始化(List Initialization)是C++11引入的统一初始化语法,其核心优势体现在以下方面:

    1. 语法统一性
      传统初始化方式包括=赋值、()构造函数调用、{}聚合初始化等,而列表初始化通过统一的{}语法覆盖了以下场景:

      int x{5};              // 基础类型 
      std::vector<int> v{1,2,3}; // 容器 
      Point p{10, 20};       // 自定义类 

    2. 隐式窄化检查
      禁止可能导致数据丢失的隐式转换,例如:

      int a = 3.14;       // 编译通过(丢失精度)
      int b{3.14};        // 编译错误!类型窄化 

    3. 动态长度支持
      可接受任意长度的初始化列表,尤其适用于容器和聚合类型:

      int arr[]{1,2,3,4,5};    // 数组长度自动推导为5 
      std::list<int> lst{10};  // 初始化含单个元素10的链表 
      


    二、基础数据类型与数组初始化

    1. 基础类型初始化

    传统初始化与列表初始化对比:

    int x = 5;      // 传统赋值 
    int y{5};       // 列表初始化(推荐)
    int z{};        // 默认初始化为0 
    

    2. 数组初始化

    支持自动长度推导省略等号的简洁语法:

    int arr1[] = {1,2,3};     // C++03风格 
    int arr2[]{4,5,6};        // C++11风格(自动推导长度)
    char str[]{"Hello"};      // 字符串数组初始化 

    三、类与结构体初始化

    1. 构造函数匹配规则

    • 若类定义了std::initializer_list构造函数,优先调用该构造函数

      class Widget {
      public:Widget(std::initializer_list<int> list) {// 处理初始化列表...}
      };
      Widget w{1,2,3};  // 调用initializer_list构造 
      

    • 若无initializer_list构造,则匹配参数数量最接近的普通构造函数:

      class Point {
      public:Point(int x, int y) {...}
      };
      Point p{10, 20};  // 调用Point(int, int)
      

    2. 注意事项

    当存在参数类型歧义时,列表初始化可能引发意外行为:

    std::vector<int> v1(5, 1); // 包含5个1:[1,1,1,1,1]
    std::vector<int> v2{5, 1}; // 包含两个元素:[5,1]

    四、标准容器初始化

    列表初始化彻底改变了容器的使用体验:

    // 初始化容器元素 
    std::vector<int> vec{1,2,3,4,5}; // 嵌套容器初始化 
    std::map<int, std::string> m{{1, "Alice"}, {2, "Bob"}
    };// 动态分配容器 
    auto p = new std::list<std::string>{"cpp", "java", "python"};

    五、聚合类型(Aggregate Types)初始化

    1. 聚合类型定义

    满足以下条件的类/结构体:

    • 无用户自定义构造函数
    • 无私有或保护的非静态成员
    • 无基类和虚函数

    2. 初始化规则

    按成员声明顺序初始化,支持嵌套初始化:

    struct Address {std::string city;int zipcode;
    };struct Person {std::string name;int age;Address addr;
    };Person p{"Tom", 30, {"Shanghai", 200000}};

    六、总结与实践建议

    最佳实践

    1. 优先使用列表初始化替代=()初始化
    2. 警惕auto推导陷阱
      auto x{5}; 在C++11中推导为std::initializer_list<int>
    3. 自定义类型设计
      若需要支持不定长初始化,应实现std::initializer_list构造函数

    性能提示

    列表初始化可能引入临时对象构造开销,在性能敏感场景建议进行基准测试。

    拓:聚合类型条件解析:"无私有或保护的非静态成员"

1. 聚合类型定义条件表格
条件符合要求的示例不符合要求的示例违反后果
无用户自定义构造函数struct A { int x; };struct B { B(){} int x; };无法使用B{1}初始化
无私有/保护的非静态成员struct C { int a; public: int b; };struct D { private: int x; };无法直接列表初始化私有成员
无基类(C++11~C++17)struct E { int x; };struct F : E {};C++20前无法聚合初始化派生类
无虚函数struct G { int x; };struct H { virtual void f(){} };无法使用H{}初始化
2. 关键概念解释

"无私有/保护的非静态成员"

  • 含义:所有非静态数据成员必须是公有(public)访问权限
  • 技术背景:列表初始化需要直接访问成员,私有成员需通过构造函数赋值
  • 示例分析
    struct Valid {int a;         // public(默认)public: int b; // 显式public 
    };
    Valid v{1, 2};    // 成功:成员均为public struct Invalid {private: int x; // 私有成员 
    };
    Invalid i{5};      // 错误:无法访问私有成员 

http://www.xdnf.cn/news/72811.html

相关文章:

  • Linux系统-cat命令/more命令/less命令
  • Kubernetes集群超配节点容量
  • MCP的发展历程
  • 批量创建同名文件夹并整理文件至对应文件夹
  • Day5-UFS总结
  • 基于vue框架的电脑配件网上商城18xsv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • aws文件存储服务——S3介绍使用代码集成
  • 第5章:MCP框架详解
  • Python 之 __file__ 变量导致打包 exe 后路径输出不一致的问题
  • skyreels
  • 【Python网络爬虫开发】从基础到实战的完整指南
  • 婴幼儿托育服务与管理实训室的设备配置与功能优化
  • Kubernetes相关的名词解释Service(15)
  • 怎么安装python3.5-以及怎么在这个环境下安装包
  • 【机器学习-线性回归-1】深入理解线性回归:机器学习中的经典算法
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(8): - (1)复习一些语法(2)「~ています」
  • SpringCloud和SpringCloudAlibaba技术栈全面对比
  • js添加点击监控事件的方式
  • CCF CSP 第37次(2025.03)(1_数值积分_C++)
  • 网工实验——按照接口划分VLAN
  • 影楼精修-中性灰磨皮算法解析
  • redhat秘钥登入
  • 基础知识查缺补漏:RMSE和MSE
  • TOGAF 敏捷冲刺:15 天 Scrum 冲刺实践
  • CentOS7安装MySQL教程
  • 01-初识前端
  • 9.策略模式:思考与解读
  • [FPGA基础] FIFO篇
  • 上位机软件开发的关键技术与应用解析​
  • uCOS3实时操作系统(系统初始化和任务启动)