我有以下代码;
#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发布于 2013-12-25 01:22:12
aSlog = bSlog; // 1aSlog的每个成员将被设置为bSlog的相应值。这是一个浅拷贝,因此该结构中的任何指针都将被设置为相同的值。由于aSlog和bSlog是相同的类型,所以这是一个隐式复制赋值操作符.
bSlog.ime1 = cSlog.ime2; // 2这将将bSlog的bSlog成员设置为cSlog的ime2值。这将使用char的复制赋值操作符。
aSlog = cSlog; // 3这不应该编译,因为这段代码中没有任何东西告诉编译器如何将Slog1类型转换为Slog2类型。您需要一个转换构造函数(一个在Slog1中声明的带有Slog2参数的构造函数)。
struct Slog2
{
char ime2;
int broj2;
};
struct Slog1
{
char ime1;
int broj1;
// ...
// conversion-constructor
Slog1(const Slog2& s2) : ime1(s2.ime2), broj1(s2.broj2)
{ }
// copy-assignment conversion
Slog1& operator=(const Slog2& s2)
{
ime1 = s2.ime2;
broj1 = s2.broj2;
return *this;
}
};发布于 2013-12-25 01:22:12
Slog1和Slog2是完全不相关的类型。无论您给它们相同的布局,编译器都会拒绝从另一个中分配一个,只要您没有提供显式的转换构造函数/赋值操作符/ cast运算符。
发布于 2013-12-25 01:26:53
aSlog = bSlog; // 1您没有为类Slog1重载赋值操作符,因此这使用隐式声明和隐式定义的赋值运算符成员函数。隐式定义的赋值运算符执行一个浅拷贝。
aSlog = cSlog; // 3类Slog1和Slog2是不相关的,所以这不会按-是因为您没有定义执行此分配的机制而编译。您可以使用类Slog1中的赋值操作符作为参数接收Slog2,在类Slog1中使用转换构造函数以Slog2作为参数,或者使用类Slog2中的operator Slog1生成Slog1作为输出。
https://stackoverflow.com/questions/20768274
复制相似问题