為什么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 回答

慕的地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 關注
- 559 瀏覽
添加回答
舉報
0/150
提交
取消