深入理解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
}
相关推荐
H.莓飛18 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu11419 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶20 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
小灰灰搞电子20 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放20 小时前
面向对象高级(实战案例)
开发语言·python·学习
·present·21 小时前
CSAPP(lecture 4_01)
c语言·c++
FPGA小迷弟21 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
c++·python·ai·plotly·django·ai编程·claude
fanruitian1 天前
python else用法
开发语言·python
程序员-King.1 天前
【ROS1】Noetic 开发工作流程与常用命令
c++·ubuntu·ros
FRing031 天前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数