我们知道我们只能将一个结构对象分配给另一个具有相同类型的结构对象,但为什么我们不能将一个类型A的结构对象分配给另一个类型为B的结构对象?
下面,
struct typeA{
int inA1;
int inA2;
};
struct typeB{
int inB1;
int inB2;
};
int main(){
typeA varA;
typeB varB;
varA = varB//Here it will show compile time error. Why it can't
//assign object of typeB to object of typeA since both have
//same type of members
return 0;
}
为什么我们不能将typeB结构的对象分配给typeA结构的对象,因为它们都具有相同类型的成员?
为什么不将不同类型的结构对象分配给另一个,因为它们可能有相同的成员?
答案 0 :(得分:3)
编译器将生成赋值运算符以分配相同类型的变量。但是,即使两种类型都具有相同的布局,它也不会为它生成赋值运算符。它也是完全可以理解的,因为它很容易出错。
为什么会出现错误?
好吧,想象一下typeB
是否会被定义为:
struct typeB{
int inB2;
int inB1;
};
非常令人费解的嘿?即使typeA
和类型typeB
具有相同的布局,您也希望inA1
获取inB1
的值,但相反的情况会发生,{ {1}}将取inA1
。
由于名称不会影响布局,并且编制者不知道您对该作业应该如何做的意图,因此它不会假设任何内容,也不会创建错误编写的赋值运算符。
因此,默认情况下不会生成您希望存在的赋值运算符,但您可以确定编写一个:
inB2
现在编译器知道如何按照预期的方式分配它们。
答案 1 :(得分:1)
您不能将不同类型相互指定为安全手段。虽然基础类型在字面上是兼容的,但编译器并不知道语义 - 您可能会意外地将某人的年龄和体重分配到他们的血压测量值中。
如果您确实想要这样做,可以将varB转换为typeA:
varA = (typeA)varB;
这指示编译器你非常确定你想要做什么,尽管在某些情况下,编译器可能会选择警告你,如果它检测到你可能丢失了一些信息,但它也可能没有。
答案 2 :(得分:0)
这不是您正在寻找的答案,但如果您不想要显式构造函数。您可以让隐式构造函数处理这种情况 varA = varB;
#include <iostream>
struct typeA{
int inA1;
int inA2;
};
struct typeB : typeA
{
int inB1;
int inB2;
// implicit default ctor typeB::typeBB()
// implicit copy ctor typeB::typeB(const B&)
};
int main(){
typeA varA;
typeB varB;
varA = varB;//handled by implicit constructor
return 0;
}