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
相关产品推荐
相关产品推荐

