无需编写构造函数初始化C++结构体的方法及名称咨询
关于C++结构体无构造函数初始化的问题
问题1:是否存在无需编写构造函数的初始化机制?
当然存在!而且这是C++11及后续标准里非常实用的特性,完全不需要给test结构体手动写任何构造函数就能实现你描述的初始化。
你的test结构体属于C里的聚合类型(满足没有用户声明的构造函数、没有私有/保护的非静态数据成员、没有基类、没有虚函数等条件),针对这类类型,C提供了专门的初始化方式。
你提到的两种写法都是合法的,但支持的标准版本有区别:
test{1, 2, "test1"}:C++11开始就支持,用花括号的列表初始化语法直接给结构体的成员按顺序赋值。test(1, 2, "test1"):C++17新增的特性,允许用圆括号来初始化聚合类型,看起来像调用构造函数,但实际上不需要你定义任何构造函数,是聚合初始化的扩展形式。
举个完整的可运行示例:
#include <iostream> #include <map> #include <string> struct test { int a; int b; std::string str; }; int main() { std::map<int, test> test_map; // C++11及以后都能用的写法 test_map[0] = test{1, 2, "test1"}; // C++17及以后可用的写法 test_map[1] = test(3, 4, "test2"); // 验证一下 std::cout << test_map[0].a << ", " << test_map[0].str << std::endl; std::cout << test_map[1].b << ", " << test_map[1].str << std::endl; return 0; }
问题2:该机制的名称是什么?
这个核心机制叫做聚合初始化(Aggregate Initialization)。
其中:
- 你提到的花括号写法
test{...}是聚合初始化结合了C++11引入的**列表初始化(List Initialization)**语法,这是最常用的形式。 - 圆括号写法
test(...)是C++17对聚合初始化的扩展,它让聚合类型的初始化语法和有构造函数的类更一致,使用起来更灵活。
内容的提问来源于stack exchange,提问作者code_fodder
相关产品推荐
相关产品推荐

