C++:union类型
class和struct在C++上基本没啥区别,就只有class成员权限默认为private而struct默认为public
而union和前两者稍有不同,其最大的区别在于内部成员变量共享一块内存,只是这个内存可以存放不同的变量类型(占用内存大小选取取占用最大的成员变量的占用内存),所以每次无论对哪个成员更改都会将所有成员都修改,因为他们本来就是同一个数据。
下面用一个例子:TYPEA有两种数据成员类型,当我们对成员a赋值,输出结果如下
union TYPEA { float a; int b; }; TYPEA a1; a1.a = 1.0; //a1.b = 2; std::cout << "a1.a = " <<a1.a <<std::endl;
可以看到没什么问题
当我们对a赋值后再对b赋值,结果如下
union TYPEA { float a; int b; }; TYPEA a1;
//先赋值a再赋值b a1.a = 1.0; a1.b = 2; std::cout << "a1.a = " << a1.a << std::endl; std::cout << "a1.b = " <<a1.b <<std::endl;
可以看到最后赋值的b没问题,而a显然被修改了,这是因为a和b本身公用一块内存,修改了b相当于a也被改动了,由于数据类型表示方法不同,可能会是一个难以理解的数
这种数据可以用来解决内存占用问题,当我们需要定义一个数据但不确定他是什么类型时可以使用,如IP地址,我们不清楚是IPV4还是IPV6,则可以用union定义两个成员变量,需要初始化时选择其一。