为什么C和C ++支持在结构中成员分配数组,但一般不支持?我理解不支持成员分配数组,因此以下方法不起作用:int num1[3] = {1,2,3};int num2[3];num2 = num1; // "error: invalid array assignment"我只是接受了这个事实,认为该语言的目的是提供一个开放式框架,并让用户决定如何实现诸如复制数组之类的东西。但是,以下工作正常:struct myStruct { int num[3]; };struct myStruct struct1 = {{1,2,3}};struct myStruct struct2;struct2 = struct1;该数组num[3]是从其实例中成员分配struct1到其实例中的struct2。为什么结构支持成员方式的数组,但一般情况下不支持?
3 回答
![?](http://img1.sycdn.imooc.com/5333a1a90001c8d802000200-100-100.jpg)
慕的地10843
TA贡献1785条经验 获得超8个赞
关于赋值运算符,C ++标准如下(C ++03§5.17/ 1):
有几个赋值运算符... 都需要一个可修改的左值作为它们的左操作数
数组不是可修改的左值。
但是,特别定义了对类类型对象的赋值(§5.17/ 4):
对类的对象的赋值由复制赋值运算符定义。
因此,我们期待看一个类的隐式声明的复制赋值运算符(§12.8/ 13):
类X的隐式定义的复制赋值运算符执行其子对象的成员分配。...每个子对象都以适合其类型的方式分配:
...
- 如果子对象是一个数组,则以适合于元素类型的方式分配每个元素
...
因此,对于类类型对象,可以正确复制数组。请注意,如果您提供用户声明的复制赋值运算符,则无法利用此操作,并且您必须逐个元素地复制数组。
推理在C(C99§6.5.16/ 2)中类似:
赋值运算符应具有可修改的左值作为其左操作数。
并且§6.3.2.1/ 1:
一个可修改的左值是一个没有数组类型的左值... [其他约束如下]
在C中,赋值比C ++(§6.5.16.1/ 2)简单得多:
在简单赋值(=)中,右操作数的值将转换为赋值表达式的类型,并替换存储在左操作数指定的对象中的值。
对于struct-type对象的赋值,左右操作数必须具有相同的类型,因此右操作数的值只是复制到左操作数中。
- 3 回答
- 0 关注
- 534 浏览
添加回答
举报
0/150
提交
取消