int n;
}u1;
volatile union U1 u2;
u2=u1; //这条语句有错误
union stt{
int xx;
}sa;
union stt sb;
sa =sb;//这条可以成功
请问为什么,有什么不一样吗?
9 个解决方案
#1
volatile union U1 u2;
u2=u1; //这条语句有错误
仔细看看有什么不同。变量名字换一下看看。
u2=u1; //这条语句有错误
仔细看看有什么不同。变量名字换一下看看。
#2
把volatile去掉就可以了,这是类型不匹配问题。当然别忘记了初始化。
#3
多了个volatile
#4
volatile 修饰的变量不能由自己的程序修改
#5
因为编译器自动合成的赋值运算不能作用在volatile对象上。
可以自己写一个volatile版本的赋值运算。
可以自己写一个volatile版本的赋值运算。
union U1 {
int n;
// 用于volatile对象的赋值运算
// 请注意它以volatile对象为输入,并返回一个volatile对象
volatile U1& operator=(const volatile U1& u) volatile
{
n = u.n;
return *this;
}
}u1;
#6
与const类似,平凡对象可以转换为volatile对象,反之则不行。
所以对于cv对象的操作一般要另外编写。
所以对于cv对象的操作一般要另外编写。
#7
同样类似与const,要将volatile对象转换为平凡对象,可以使用const_cast,如:
u1 = const_cast<union U1&>(u2); // 这里调用编译器自动合成的U1& operator=(const U1& u);
u1 = const_cast<union U1&>(u2); // 这里调用编译器自动合成的U1& operator=(const U1& u);
#8
你这种用法即使成功,好像也不符合标准,union 不能直接赋值的!不能像结构体一样对象赋值的!
#9
这种说法不对,union是一种自定义类型,除了它的特殊之处(如复用内存空间等等),与class或struct在很多地方都是类似的。事实上,"union"作为一种"class-key",是用来定义类(class)的,这就意味着union与class或struct的相似程度大大高于其他自定义类型(如enum)。应该这样理解union:除了标准中指出的不同,它和class或struct是一样的。
以下是标准中对union的定义(摘自《C++ Standard--ISO/IEC 14882:2003(E)》之[class]):
A union is a class defined with the class-key union; its members are public by default and it holds
only one data member at a time...
此外,还有其他一些不同,这里就不一一列举了。
综上所述,为union定义函数或操作,是很自然的。
至于赋值,在C++标准中也有明确的示例,如(摘自《C++ Standard--ISO/IEC 14882:2003(E)》之[dcl.init.aggr]):
union u { int a; char* b; };
u a = { 1 };
u b = a; // here
事实上赋值比其他操作适用于更加广泛的类型;因为如果一个类型不能被赋值的话,它就不能被定义成类的数据成员了。
当然5楼到7楼的内容也都适用于class和struct。
#1
volatile union U1 u2;
u2=u1; //这条语句有错误
仔细看看有什么不同。变量名字换一下看看。
u2=u1; //这条语句有错误
仔细看看有什么不同。变量名字换一下看看。
#2
把volatile去掉就可以了,这是类型不匹配问题。当然别忘记了初始化。
#3
多了个volatile
#4
volatile 修饰的变量不能由自己的程序修改
#5
因为编译器自动合成的赋值运算不能作用在volatile对象上。
可以自己写一个volatile版本的赋值运算。
可以自己写一个volatile版本的赋值运算。
union U1 {
int n;
// 用于volatile对象的赋值运算
// 请注意它以volatile对象为输入,并返回一个volatile对象
volatile U1& operator=(const volatile U1& u) volatile
{
n = u.n;
return *this;
}
}u1;
#6
与const类似,平凡对象可以转换为volatile对象,反之则不行。
所以对于cv对象的操作一般要另外编写。
所以对于cv对象的操作一般要另外编写。
#7
同样类似与const,要将volatile对象转换为平凡对象,可以使用const_cast,如:
u1 = const_cast<union U1&>(u2); // 这里调用编译器自动合成的U1& operator=(const U1& u);
u1 = const_cast<union U1&>(u2); // 这里调用编译器自动合成的U1& operator=(const U1& u);
#8
你这种用法即使成功,好像也不符合标准,union 不能直接赋值的!不能像结构体一样对象赋值的!
#9
这种说法不对,union是一种自定义类型,除了它的特殊之处(如复用内存空间等等),与class或struct在很多地方都是类似的。事实上,"union"作为一种"class-key",是用来定义类(class)的,这就意味着union与class或struct的相似程度大大高于其他自定义类型(如enum)。应该这样理解union:除了标准中指出的不同,它和class或struct是一样的。
以下是标准中对union的定义(摘自《C++ Standard--ISO/IEC 14882:2003(E)》之[class]):
A union is a class defined with the class-key union; its members are public by default and it holds
only one data member at a time...
此外,还有其他一些不同,这里就不一一列举了。
综上所述,为union定义函数或操作,是很自然的。
至于赋值,在C++标准中也有明确的示例,如(摘自《C++ Standard--ISO/IEC 14882:2003(E)》之[dcl.init.aggr]):
union u { int a; char* b; };
u a = { 1 };
u b = a; // here
事实上赋值比其他操作适用于更加广泛的类型;因为如果一个类型不能被赋值的话,它就不能被定义成类的数据成员了。
当然5楼到7楼的内容也都适用于class和struct。