C++零基础——C与C++共用体的区别

by LauCyun Jun 18,2015 06:12:36 4,214 views

union 是体内时时刻刻都只有一个变量使用,即“多人同穿一条裤子”。分析C与C++共用体的区别,如下:

先看一下,C语言的共用体,如:

union myunion
{
	int num;       //int类型数据
	double data;   //double类型数据
	float f = 1.0; //error "f":不能初始化值
	void(*p)();    //p函数指针
	void go();     //error C2032: “go”: 函数不能是 union“myunion” 的成员
};

在C语言中,共用体是不能含有函数,也不能初始化值。接着,分析CPP共用体:

#include<iostream>
using namespace std;
//union MyUnion默认是公有,设置私有private:

union MyUnion
{
	int num1;
	float fl1;
	void go()
	{
		cout << "hello world!" << endl;
	}
};

//共用体无法继承,多态
union MyU : public MyUnion //error C2570: “MyU”: 联合不能有基类
{
}

int main()
{
	MyUnion my1{ 14 };//只能初始化一个变量
	cout << my1.num1 << endl;
	my1.fl1 = 10.8;
	cout << my1.num1 << endl;
	cin.get();
	return 0;
}

所以,1、CPP中 union 中的成员可以初始化,但是只能初始化一个成员;内部可以有函数,定义变量不需要 union 关键字。

union myunion
{
	int num = 10;
	double db = 10.11; //error C2836: 只有联合的一个非静态数据成员可以具有类内初始值设定项
	void go()
	{
		cout << "hello ak" << endl;
	}
};

2、CPP中 union 中的成员默认是公有的,但是我们可以设置为私用,如下:

union MyUnion
{
private:  //私用
	int num1;
	float fl1;
	void go()
	{
		cout << "hello world!" << endl;
	}
};

3、CPP中 union 无法继承,多态。4、CPP中 union 初始化只能初始化一个。

#include<iostream>
using namespace std;

union myunion
{
	int num = 10;
	double db;
	void go()
	{
		cout << "hello" << endl;
	}
};

int main()
{
	cout << sizeof(myunion) << endl;
	myunion  *p(nullptr);
	p->go();     //初始化只能初始化一个
	return 0;
}

5、CPP中 union 的共享内存不计入代码区的大小。

union myunion
{
	void go()
	{
		cout << "hello" << endl;
	}
};
cout << sizeof(myunion) << endl; //1


Tags