网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
2.共用体变量中起作用的成员是最后一个存放的成员,在存入一个新的成员后,原有的成员就失去作用。比如以下的代码:
复制代码 代码如下:
#include
using namespace std;
union test
{
char mark;
long num;
float score;
}a;
int main()
{
// cout<<a<<endl; // wrong
a.mark = ‘b’;
cout<<a.mark<<endl; // 输出’b’
cout<<a.num<<endl; // 98 字符’b’的ACSII值
cout<<a.score<<endl; // 输出错误值
a.num = 10;
cout<<a.mark<<endl; // 输出空
cout<<a.num<<endl; // 输出10
cout<<a.score<<endl; // 输出错误值
a.score = 10.0;
cout<<a.mark<<endl; // 输出空
cout<<a.num<<endl; // 输出错误值
cout<<a.score<<endl; // 输出10
return 0;
}
所以,在使用union的时候,要十二分的小心的。
3.由于union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。
4.不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。
5.union类型可以出现在结构体类型定义中,也可以定义union数组,反之,结构体也可以出现在union类型定义中,数组也可以作为union的成员。
按理说,总结到这里,C语言中的union也就没什么更多的要说了。但是,有一种东西叫做C++,在这个C++中有一种东西叫做类。
当union遇到对象
就单单C中的union,上面的总结已经够用了,但是,现在偏偏又有一个叫做C++的东西;当union遇到了C++中的对象时,一切又变得剪不断,理还乱。上面总结的union使用法则,在C++中依然适用。本来union本就是从C语言中的,如果我们在C++中继续按照C语言的那种方式使用union,那是没有问题的。如果我们在union中放一个类的对象呢?结果会怎么样?比如有以下代码:
复制代码 代码如下:
#include
using namespace std;
class CA
{
int m_a;
};
union Test
{
CA a;
double d;
};
int main()
{
return 0;
}
可以看到,没有问题;如果我们在再类CA中添加了构造函数,或者添加析构函数,我们就会发现程序就会出现错误。由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。
结束的话
我们都在玩那些高大上的东西,猛回头,发现身后却又一个大坑。打开尘封了多年的《C语言程序设计》(谭浩强著),小心翼翼的拭去封面上的尘土,思绪立刻被拉回到大一。那些年,我那清纯的大一。对大学的憧憬,对计算机的好奇,对编程的未知,就是这本书,这本该死的《C语言程序设计》,把我带上了“程序猿”这条不归路。说多了,都是泪,当你看我这篇文章时,你应该懂我的。CodeMonkey~~~,这条不归路,且行且珍惜。
=修改日志=
2014年9月11日 删除了文中“不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。”这样的描述,非常感谢Cassie_Lcy的指正,而且还在评论中附上了验证代码,非常感谢;同时,我也非常抱歉,对于这点没有验证过的知识,就进行了总结,对大家造成了一定的误导,sorry。一定要注重求学的严谨性。
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li><a href="/article/125134.htm" title="C语言中联合体union的实例详解" target="_blank">C语言中联合体union的实例详解</a></li><li><a href="/article/91141.htm" title="C语言 共用体(Union)详解及示例代码" target="_blank">C语言 共用体(Union)详解及示例代码</a></li><li><a href="/article/75794.htm" title="C语言编程中的联合体union入门学习教程" target="_blank">C语言编程中的联合体union入门学习教程</a></li><li><a href="/article/205661.htm" title="C语言关键字union的定义和使用详解" target="_blank">C语言关键字union的定义和使用详解</a></li></ul>
</div>
</div>
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!