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

C++ 列表初始化(initializer_list)

列表初始化(initializer_list)

列表初始化是C++中的一种语法特性,引入于C++11,用于更简单直观地初始化变量、对象或容器。它使用花括号 {},提供了更安全的初始化方式,避免了类型窄化转换等潜在错误。

定义

列表初始化是用花括号 {} 提供初始值来初始化变量或对象。根据上下文,它支持以下几种用途:

  1. 初始化简单变量
  2. 初始化结构体或类
  3. 初始化标准容器(如std::vector、std::array等)
  4. 统一初始化方式,取代传统的构造函数或等号赋值。

功能作用

1. 更简洁的初始化语法
使用花括号直接提供初始值。

2. 防止窄化转换
比如尝试将浮点数赋值给整数时,编译器会报错。

3. 适用于自动推导类型
结合auto或模板代码更高效。

4. 统一语法
替代不同的构造函数初始化方法,提供一致的代码风格。

列表初始化参考代码

#include <iostream>
#include <vector>
#include <array>
#include <string>

// 自定义结构体
struct Point {
    int x;
    int y;
};

// 自定义类
class Rectangle {
    int width, height;
public:
    // 构造函数
    Rectangle(int w, int h) : width(w), height(h) {}

    void print() const {
        std::cout << "Rectangle(width: " << width << ", height: " << height << ")\n";
    }
};

int main() {
    // 1. 简单变量的列表初始化
    int a{10};           // 等价于 int a = 10;
    double b{3.14};      // 初始化浮点数
    // int c{3.14};      // 编译错误,防止窄化转换
    std::cout << "a = " << a << ", b = " << b << '\n';

    // 2. 数组或std::array初始化
    int arr[] = {1, 2, 3, 4, 5};
    std::array<int, 3> stdArr = {10, 20, 30};
    std::cout << "Array: ";
    for (int i : arr) std::cout << i << " ";
    std::cout << "\nstd::array: ";
    for (int i : stdArr) std::cout << i << " ";
    std::cout << '\n';

    // 3. 初始化自定义结构体
    Point p1{1, 2};
    std::cout << "Point(x: " << p1.x << ", y: " << p1.y << ")\n";

    // 4. 初始化自定义类
    Rectangle rect{5, 10};
    rect.print();

    // 5. 使用标准容器
    std::vector<int> vec{10, 20, 30, 40};
    std::cout << "Vector: ";
    for (int v : vec) std::cout << v << " ";
    std::cout << '\n';

    // 6. 使用auto推导类型
    auto x = {1, 2, 3};  // 推导为std::initializer_list<int>
    std::cout << "Auto list: ";
    for (int v : x) std::cout << v << " ";
    std::cout << '\n';

    return 0;
}

列表初始化参考代码输出结果

a = 10, b = 3.14
Array: 1 2 3 4 5 
std::array: 10 20 30 
Point(x: 1, y: 2)
Rectangle(width: 5, height: 10)
Vector: 10 20 30 40 
Auto list: 1 2 3 

注意事项

1. 防止窄化转换
使用列表初始化时,编译器会阻止可能导致精度丢失的类型转换。

2. 初始化优先级
如果类提供了构造函数,与列表初始化冲突时可能导致编译错误,需要明确类的构造函数声明。

3. 与std::initializer_list的关系
如果类提供了std::initializer_list构造函数,则列表初始化会优先调用该构造函数。

通过列表初始化,可以编写更安全、简洁且更具可读性的代码。


http://www.kler.cn/a/430167.html

相关文章:

  • Go validator验证参数是否零值以及是否传递
  • IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】
  • IO进程学习笔记
  • 最新 AI 编程工具全面对比:v0、Bolt.new、Cursor、Windsurf
  • 树莓派 PICO RP2040 MACOS 使用
  • ArcMap 分析面到线、线到线、面重叠等功能操作
  • SQL中IN和NOT操作符的用法
  • 概率论相关知识随记
  • 【大语言模型】LangChain LCEL 表达式语言
  • leetcode-88.合并两个有序数组(易理解)
  • DApp开发如何平衡性能与去中心化?
  • Linux 远程连接服务
  • 6月份stable diffusion animatediff等插件使用指南,又来更新了
  • 生成表格pdf格式
  • 贪心算法 part04
  • HTML语义化的案例分析
  • 伺服电机为什么会变慢?
  • CSS学习记录08
  • Java 学习全攻略:从入门到精通的详细指南
  • python网络爬虫基础:html基础概念与遍历文档树