结构体赋值的问题
代码如下
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
当你写下 s1 = s2 这个语句, s1 的结构成员就被赋值为和 s2 一样。这个看着很简单的赋值行为其实并不是想当然的那么简单,等于号本身并不能自动地帮你作结构体间的赋值。事实上在 C++ 中这稍微有些复杂:
C++ 中 struct 行为几乎和 class 一致,struct 对象间赋值实际上是执行赋值运算符。
如果你没有为 struct 重载赋值运算符,那么编译器会自动生成一个重载函数,其赋值行为就是依次进行成员间赋值。而且这个你 struct 的成员都是可以被赋值的,所以自动生成的重载赋值运算符函数是可以正常工作的。
s1 s2 之间能相互直接用等于号赋值就是因为它们是相同的 struct 类型 st1,编译器自动帮你重载了赋值运算符,所以你写下 s1 = s2 时就可以赋值了。
可是 s3 和 s1 的类型不一致。虽然 st1 和 st2 的结构是相同的,但它们被视为是两个不同的类型。并且你也没有为它们定义转型规则(是的,C++中你可以为class定义转型规则)。所以编译器并不会帮你自动生成赋值函数,也就无法用等于号赋值。
你的编译器应该会报“operator= 参数类型不匹配”之类的错误。
举报