2017-08-08 62 views
1

我们知道,我们只能将一个结构对象分配给另一个具有相同类型的结构对象,但为什么我们不能将一个A型结构对象赋值给另一个B型结构对象?在C++中将一种结构类型赋值为另一种类型

这里,

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; 
}; 

颇令人费解呵?即使typeAtypeB类型具有相同的布局,但您会预计inA1的值为inB1,但会出现相反情况,并且inA1的值将为inB2

由于名称不会影响布局,并且编译器不知道您对该作业应该如何执行的意图,所以它不会假设任何内容,也不会创建错误编写的赋值运算符。


因此,默认情况下不会产生你预期存在即赋值运算符,但你可以写一个肯定的:

struct typeA{ 
    int inA1; 
    int inA2; 

    typeA& operator=(const typeB& rhs) { 
     inA1 = rhs.inB1; 
     inA2 = rhs.inB2; 

     return *this; 
    } 
}; 

现在编译器知道如何分配的方式,你意。

1

您不能指定不同类型作为安全手段。尽管基本类型在字面上是兼容的,但编译器并不知道语义 - 您可能意外地将某人的年龄和体重分配到他们的血压测量中。

如果你真的确定要做到这一点,你可以投varB到的typeA:

varA = (typeA)varB; 

这指示,你是非常肯定的,你想要做什么编译器,虽然在一些情况下,如果编译器检测到您可能丢失一些正在传输的信息,编译器可能会选择提醒您,但它也可能不会。

+2

由于这个问题是关于C++的,你会不会将剧组改成'reinterpret_cast'并警告OP有潜在的缺陷?谢谢。 –

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; 
} 
相关问题