C++ 列表初始化(initializer_list)

列表初始化(initializer_list)

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

定义

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

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

功能作用

1. 更简洁的初始化语法

使用花括号直接提供初始值。

2. 防止窄化转换

比如尝试将浮点数赋值给整数时,编译器会报错。

3. 适用于自动推导类型

结合auto或模板代码更高效。

4. 统一语法

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

列表初始化参考代码

cpp 复制代码
#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;
}

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

cpp 复制代码
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构造函数,则列表初始化会优先调用该构造函数。

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

相关推荐
ddacrp5 分钟前
RHEL_NFS服务器
linux·服务器·网络
叫我龙翔5 分钟前
【数据结构】从零开始认识B树 --- 高效外查找的数据结构
数据结构·c++·b树
zzzsde29 分钟前
【C++】红黑树:使用及实现
开发语言·c++·算法
点云SLAM33 分钟前
C++ 中的栈(Stack)数据结构与堆的区别与内存布局(Stack vs Heap)
开发语言·数据结构·c++·内存布局·栈数据结构·c++标准算法·heap内存分配
码界奇点35 分钟前
Linux进程间通信三System V 共享内存完全指南原理系统调用与 C 封装实现
linux·c语言·网络·c++·ux·risc-v
小无名呀1 小时前
tcp_Calculator(自定义协议,序列化,反序列化)
网络·c++·网络协议·tcp
AA陈超1 小时前
ASC学习笔记0001:处理目标选择系统中当Actor拒绝目标确认时的调用
c++·笔记·学习·游戏·ue5·游戏引擎·虚幻
ZHANG13HAO1 小时前
RV1106 通过 4G 网络基于 libdatachannel 实现 WebRTC 实时视频传输”
linux
..过云雨1 小时前
13.【Linux系统编程】从ELF格式深入理解动静态库
linux·c语言·c++·后端
长沙红胖子Qt2 小时前
QGIS开发笔记(五):qgis加载标记点功能,基础标记数量与性能对比测试
c++