为了账号安全,请及时绑定邮箱和手机立即绑定

结构体赋值的问题

代码如下
struct  st1{int  a, b;  float  x, y;}s1, s2;
struct  st2{int  a, b;  float  x, y;}s3, s4;
为什么s1和s3之间不能相互赋值

正在回答

3 回答

当你写下 s1 = s2 这个语句, s1 的结构成员就被赋值为和 s2 一样。这个看着很简单的赋值行为其实并不是想当然的那么简单,等于号本身并不能自动地帮你作结构体间的赋值。事实上在 C++ 中这稍微有些复杂:

C++ 中 struct 行为几乎和 class 一致,struct 对象间赋值实际上是执行赋值运算符

如果你没有为 struct 重载赋值运算符,那么编译器会自动生成一个重载函数,其赋值行为就是依次进行成员间赋值。而且这个你 struct 的成员都是可以被赋值的,所以自动生成的重载赋值运算符函数是可以正常工作的。

s1 s2 之间能相互直接用等于号赋值就是因为它们是相同的 struct 类型 st1,编译器自动帮你重载了赋值运算符,所以你写下 s1 = s2 时就可以赋值了。


可是 s3 和 s1 的类型不一致。虽然 st1 和 st2 的结构是相同的,但它们被视为是两个不同的类型。并且你也没有为它们定义转型规则(是的,C++中你可以为class定义转型规则)。所以编译器并不会帮你自动生成赋值函数,也就无法用等于号赋值。

你的编译器应该会报“operator= 参数类型不匹配”之类的错误。

1 回复 有任何疑惑可以回复我~

我测试了一下,可以相互赋值。下面是代码,打印结果是   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;

}


0 回复 有任何疑惑可以回复我~

我也不知道...

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之起航篇
  • 参与学习       291032    人
  • 解答问题       760    个

C++亮点尽在其中,本课程是在C语言基础上的一个延伸,得以升华

进入课程

结构体赋值的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信