C++结构体内置数组初始化方法及对象直接赋值疑问解析
嘿,这两个问题都是C++里聚合类型和数组操作的常见疑问,我来一步步给你解释清楚:
问题1:如何在C++结构体中初始化内置数组?
结构体里的内置数组初始化,分两种场景来处理:
定义结构体对象时直接初始化
你的myInt是一个聚合类型(没有自定义构造函数、没有私有/保护成员、没有基类和虚函数的结构体),所以可以直接用花括号列表来初始化整个结构体,数组成员会自动被按顺序填充:// C++03及以后都支持的写法 myInt mi = {1, 2, 3, 4, 5, 6, 7}; // C++11及以后可以省略等号,更简洁 myInt mi{1, 2, 3, 4, 5, 6, 7};如果数组元素数量少于数组大小,剩下的元素会被值初始化(比如int数组的话就是0)。
已经定义的对象,给数组成员赋值
如果你已经定义了mi,想修改数组里的内容,不能直接给mi.a赋值(后面会说原因),但可以用这几种方式:- 逐个元素赋值:
mi.a[0] = 1; mi.a[1] = 2; ... - 使用
std::copy(需要包含<algorithm>头文件):int temp[] = {1,2,3,4,5,6,7}; std::copy(std::begin(temp), std::end(temp), std::begin(mi.a)); - 换成
std::array(C++11+推荐):把结构体里的int a[7]改成std::array<int,7> a,这样就可以直接赋值了:struct myInt { std::array<int,7> a; }; myInt mi; mi.a = {1,2,3,4,5,6,7}; // 完全合法
- 逐个元素赋值:
问题2:为什么可以直接给结构体对象mi赋值,而mi.a不行?
这得从C++的类型规则说起:
结构体对象的赋值合法性
你的myInt是聚合类型,C++11及以后标准支持用花括号初始化列表对聚合类型对象进行赋值操作(也就是mi = {1,2,3,4,5,6,7};这种写法)。本质上,这个操作是把花括号里的元素按顺序匹配结构体的成员——因为myInt只有一个成员a[7],所以整个列表会被用来初始化这个数组成员,相当于给整个结构体做了一次聚合赋值。数组不能直接赋值的原因
如果你尝试写mi.a = {1,2,3,4,5,6,7};,编译器会报错,因为C++里的内置数组类型没有赋值运算符。数组变量是一个左值,但它是“不可修改的左值”——你只能修改数组里的单个元素,而不能直接把另一个数组(或者花括号列表)赋值给它。
总结一下:结构体作为聚合类型,支持用花括号列表赋值;但内置数组本身不支持直接赋值,所以只能通过其他方式修改其元素。
内容的提问来源于stack exchange,提问作者Spencer
相关产品推荐
相关产品推荐

