結構體賦值的問題
代碼如下
struct? st1{int? a, b;? float? x, y;}s1, s2;
struct? st2{int? a, b;? float? x, y;}s3, s4;
為什么s1和s3之間不能相互賦值
代碼如下
struct? st1{int? a, b;? float? x, y;}s1, s2;
struct? st2{int? a, b;? float? x, y;}s3, s4;
為什么s1和s3之間不能相互賦值
2017-09-16
舉報
2017-09-24
當你寫下 s1 = s2 這個語句, s1 的結構成員就被賦值為和 s2 一樣。這個看著很簡單的賦值行為其實并不是想當然的那么簡單,等于號本身并不能自動地幫你作結構體間的賦值。事實上在 C++ 中這稍微有些復雜:
C++ 中 struct 行為幾乎和 class 一致,struct 對象間賦值實際上是執行賦值運算符。
如果你沒有為 struct 重載賦值運算符,那么編譯器會自動生成一個重載函數,其賦值行為就是依次進行成員間賦值。而且這個你 struct 的成員都是可以被賦值的,所以自動生成的重載賦值運算符函數是可以正常工作的。
s1 s2 之間能相互直接用等于號賦值就是因為它們是相同的 struct 類型 st1,編譯器自動幫你重載了賦值運算符,所以你寫下 s1 = s2 時就可以賦值了。
可是 s3 和 s1 的類型不一致。雖然 st1 和 st2 的結構是相同的,但它們被視為是兩個不同的類型。并且你也沒有為它們定義轉型規則(是的,C++中你可以為class定義轉型規則)。所以編譯器并不會幫你自動生成賦值函數,也就無法用等于號賦值。
你的編譯器應該會報“operator= 參數類型不匹配”之類的錯誤。
2017-09-23
我測試了一下,可以相互賦值。下面是代碼,打印結果是 ? 2 ? ?2
#include <iostream>
using namespace std;
struct ?st1{int ?a, b; ?float ?x, y;}s1, s2;
struct ?st2{int ?a, b; ?float ?x, y;}s3, s4;
int main()
{
s1.a = 2;
cout <<s1.a<<endl;
s3.a = s1.a;
cout <<s3.a<<endl;
return 0;
}
2017-09-16
我也不知道...