深入理解C++ 构造函数<十一> initializer_list 构造

std::initializer_list<T> 是 C++11 引入的一个模板类型,定义在 <initializer_list> 中。

如果一个类定义了接受 std::initializer_list<T> 的构造函数,那么就可以用花括号 {...} 来初始化这个类的对象。

基本形式

cpp

复制代码
class MyClass {
public:
    MyClass(std::initializer_list<int> vals) {
        // vals 里就是 {1, 2, 3} 这些元素
    }
};

MyClass obj{1, 2, 3};

std::initializer_list 很轻量,内部通常只是一个指向元素数组的指针和长度。它不拥有元素,元素由编译器生成的临时数组保存。

cpp 复制代码
#include <initializer_list>
#include <iostream>
#include <vector>

class MyArray {
public:
    // initializer_list 构造函数
    MyArray(std::initializer_list<int> vals) {
        std::cout << "调用 initializer_list 构造: ";
        for (int v : vals) {
            data_.push_back(v);
            std::cout << v << ' ';
        }
        std::cout << '\n';
    }

    // 普通构造函数,用来对比
    MyArray(int count, int value) {
        std::cout << "调用普通构造 MyArray(int, int): ";
        data_.assign(count, value);
        for (int v : data_) {
            std::cout << v << ' ';
        }
        std::cout << '\n';
    }

    void print() const {
        for (int v : data_) {
            std::cout << v << ' ';
        }
        std::cout << '\n';
    }

private:
    std::vector<int> data_;
};

int main() {
    MyArray a{1, 2, 3};   // 调用 initializer_list 构造
    MyArray b(3, 7);      // 调用普通构造:3 个 7

    MyArray c{3, 7};      // 注意:花括号非空时优先调用 initializer_list 构造
                          // 所以 c 中是两个元素:3 和 7,而不是 3 个 7

    a.print();            // 1 2 3
    b.print();            // 7 7 7
    c.print();            // 3 7
}
相关推荐
橙子圆1232 分钟前
JUC之集合类不安全
java·开发语言
阿里嘎多学长12 分钟前
2026-09-29 GitHub 热点项目精选
开发语言·程序员·github·代码托管
Bruce_Liuxiaowei13 分钟前
网页版 DeepSeek “harness desktop“ WebGL 上下文创建失败排查实录
开发语言·javascript·webgl
狗凯之家源码网24 分钟前
PHP 用户反馈系统源码深度评测与实战指南
开发语言·php·用户反馈系统
小溪学编程31 分钟前
从 C++ 的规范变迁看语言发展
jvm·c++·面试
谢亮_vipxieliang1 小时前
Stream API 不是银弹:常见坑与性能建议
java·开发语言
迅猛龙办公室1 小时前
实现第一个python程序(HelloWorld)
开发语言·python
phltxy1 小时前
C 语言动态内存管理:从申请空间到安全释放
c语言·开发语言·ui
可乐鸡翅yeah_1 小时前
M3U8 防盗链 URL‑Token 签名,新手开发实操避坑
开发语言·javascript·ios·音视频·safari
ShineWinsu1 小时前
对于Redis:string类型的解析
java·c++·redis·分布式·缓存·面试·string