当我们在两个结构上使用它时,=运算符会做什么?

时间:2013-12-25 01:16:28

标签: c++ struct

我有以下代码;

#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
  1. 它究竟做了什么?编译得很好,但我不确定是这样。
  2. 这个我很清楚,它设置了bSlog的成员ime1 cSlog结构中成员ime2的值。
  3. 由于某种原因不能编译,但它与1相同。

5 个答案:

答案 0 :(得分:8)

aSlog = bSlog; // 1

aSlog的每个成员都将设置为bSlog的相应值。这是一个浅表副本,因此可能在此结构中的任何指针都将设置为相同的值。由于aSlogbSlog是相同的类型,因此这是一个隐式的复制赋值运算符。

bSlog.ime1 = cSlog.ime2; // 2

这会将ime1的{​​{1}}成员设置为bSlog的{​​{1}}值。这使用ime2的复制赋值运算符。

cSlog

这不应该编译,因为此代码中没有任何内容告诉编译器如何将char类型转换为aSlog = cSlog; // 3 类型。您需要一个转换构造函数(Slog1中声明的构造函数,它带有Slog2参数)。

Slog1

答案 1 :(得分:3)

Slog1Slog2是完全不相关的类型。无论你给它们相同的布局,只要你没有提供明确的转换构造函数 / 赋值运算符 / <,编译器就会拒绝从另一个中分配一个。 strong>演员。

答案 2 :(得分:3)

aSlog = bSlog; // 1

您没有为类Slog1重载赋值运算符,因此它使用隐式声明和隐式定义的赋值运算符成员函数。隐式定义的赋值运算符执行浅拷贝。

aSlog = cSlog; // 3

Slog1Slog2是不相关的,因此不会按原样编译,因为您没有定义执行此分配的机制。您可以使用类Slog1中的赋值运算符来接收Slog2作为参数,类Slog1中的转换构造函数以Slog2作为参数,或者类operator Slog1中的Slog2生成Slog1作为输出。

答案 3 :(得分:2)

  1. bSlog中的值将复制到aSlog
  2. aSlog的类型为Slog1,cSlog的类型为Slog2,这意味着不同的类型就像将char值添加到int变量

答案 4 :(得分:2)

  1. 它只是将aSlog(类型为Slog1)设置为等于bSlog(也是Slog1类型)。这非常有效。它就像设置一个int等于另一个int一样简单。

  2. 你是对的。这是有效的,因为Slog1.ime1和Slog2.ime2都是char类型。

  3. 这与(1)完全不同。 cSlog是不同于aSlog的类型(对于c为Slog2,对于a为Slog1),并且您不能将Slog1设置为等于Slog2。这相当于将char设置为等于int。

  4. JUst评论:选择比slog,ime和broj更好的名字。只是用人。 Slog1是男性,char ime1是他的第一个首字母,而int broj1是他的年龄。 Slog2是女性,其余的是相同的。那么你就会明白你不能将aSlog(男性)设置为等于cSlog(女性)。