You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何区分{}与()初始化的不同构造函数实现?

C++中列表初始化与直接初始化的差异及自定义实现

这种差异对应的是**列表初始化(List Initialization)和直接初始化(Direct Initialization)**的区别。C++11引入{}作为统一初始化语法,但对于std::vector这类提供多构造函数重载的类,两种初始化方式会触发不同的构造逻辑:

  • 用{}初始化时,编译器会优先匹配类中接受std::initializer_list的构造函数(如果存在)。所以std::vector<int> v1{5}会调用接受initializer_list<int>的构造,将5作为单个元素存入容器;
  • 用()初始化时,编译器会匹配对应的非initializer_list重载。这里std::vector<int> v2(5)调用的是接受size_type参数的构造函数,创建包含5个默认初始化元素的容器。

自定义类实现类似功能

要让自定义类支持这种差异,只需为类提供两个构造函数重载:一个接受std::initializer_list<T>,另一个接受对应类型的参数。示例代码如下:

#include <initializer_list>
#include <vector>
#include <iostream>

class MyContainer {
private:
    std::vector<int> data;
public:
    // 对应{}初始化:接受initializer_list的构造函数
    MyContainer(std::initializer_list<int> init) : data(init) {}

    // 对应()初始化:接受size参数的构造函数,用explicit避免隐式转换歧义
    explicit MyContainer(size_t size) : data(size, 0) {}

    // 打印容器内容用于验证
    void print() const {
        for (int num : data) {
            std::cout << num << " ";
        }
        std::cout << "\n";
    }
};

int main() {
    MyContainer c1{5};    // 初始化后内容:{5}
    c1.print();           // 输出:5 

    MyContainer c2(5);    // 初始化后内容:{0, 0, 0, 0, 0}
    c2.print();           // 输出:0 0 0 0 0 
    return 0;
}

需要注意:

  • 当类同时存在initializer_list构造和其他重载时,列表初始化{}会优先选择initializer_list版本,除非参数类型完全不匹配;
  • 用explicit修饰接受size的构造函数,能避免像MyContainer c = 5这类隐式转换带来的解析歧义。

内容的提问来源于stack exchange,提问作者gowerc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:12:36