我有以下代码;
#include <iostream>
using namespace std;
struct Slog1
{
char ime1;
int broj1;
};
struct Slog2
{
char ime2;
int broj2;
};
int main()
{
Slog1 aSlog, bSlog;
Slog2 cSlog;
aSlog = bSlog; // 1
bSlog.ime1 = cSlog.ime2; // 2
aSlog = cSlog; // 3
}
现在,我宣布:
Slog1 aSlog, bSlog;
Slog2 cSlog;
这些是我非常理解的结构变量。现在我有了这些:
aSlog = bSlog; // 1
bSlog.ime1 = cSlog.ime2; // 2
aSlog = cSlog; // 3
答案 0 :(得分:8)
aSlog = bSlog; // 1
aSlog
的每个成员都将设置为bSlog
的相应值。这是一个浅表副本,因此可能在此结构中的任何指针都将设置为相同的值。由于aSlog
和bSlog
是相同的类型,因此这是一个隐式的复制赋值运算符。
bSlog.ime1 = cSlog.ime2; // 2
这会将ime1
的{{1}}成员设置为bSlog
的{{1}}值。这使用ime2
的复制赋值运算符。
cSlog
这不应该编译,因为此代码中没有任何内容告诉编译器如何将char
类型转换为aSlog = cSlog; // 3
类型。您需要一个转换构造函数(Slog1
中声明的构造函数,它带有Slog2
参数)。
Slog1
答案 1 :(得分:3)
Slog1
和Slog2
是完全不相关的类型。无论你给它们相同的布局,只要你没有提供明确的转换构造函数 / 赋值运算符 / <,编译器就会拒绝从另一个中分配一个。 strong>演员。
答案 2 :(得分:3)
aSlog = bSlog; // 1
您没有为类Slog1
重载赋值运算符,因此它使用隐式声明和隐式定义的赋值运算符成员函数。隐式定义的赋值运算符执行浅拷贝。
aSlog = cSlog; // 3
类Slog1
和Slog2
是不相关的,因此不会按原样编译,因为您没有定义执行此分配的机制。您可以使用类Slog1
中的赋值运算符来接收Slog2
作为参数,类Slog1
中的转换构造函数以Slog2
作为参数,或者类operator Slog1
中的Slog2
生成Slog1
作为输出。
答案 3 :(得分:2)
答案 4 :(得分:2)
它只是将aSlog(类型为Slog1)设置为等于bSlog(也是Slog1类型)。这非常有效。它就像设置一个int等于另一个int一样简单。
你是对的。这是有效的,因为Slog1.ime1和Slog2.ime2都是char类型。
这与(1)完全不同。 cSlog是不同于aSlog的类型(对于c为Slog2,对于a为Slog1),并且您不能将Slog1设置为等于Slog2。这相当于将char设置为等于int。
JUst评论:选择比slog,ime和broj更好的名字。只是用人。 Slog1是男性,char ime1是他的第一个首字母,而int broj1是他的年龄。 Slog2是女性,其余的是相同的。那么你就会明白你不能将aSlog(男性)设置为等于cSlog(女性)。