C++结构体,联合体与枚举类

时间:2022-06-16 04:58:40

结构体:

C++的结构体可以理解为C语言结构体的升级版,也可以理解为特殊的类,很少用,目的是和C语言保持兼容

与类的唯一区别是:类中的成员如果定义在类体的最开头,既没有访问属性(缺省访问),则默认是私有的,而结构体相反默认是公有的


联合体:

union 联合体名称
{
	公有成员
	protected:
		保护型成员
	private:
		私有成员
}

特点:①和C语言中的联合一样,成员共用同一组内存单元,任何两个成员不会同时有效

②联合体可以没有名称,例如下面:

union
{
	int n;
	double k;
}
int main(void)
{
	n = 10;
	k = 2.2;		//给f赋值后,之前n的值(10)就会被冲掉
}


枚举类:

例如:

enum class Typename1 {General, Light, Medium, Heavy};

(不定义底层类型默认int,里面的值分别对应0,1,2,3)

enum class Typename2: char{General, Light, Medium, Heavy};

enum class Typename3 {General=4, Pistol, MachineGun, Cannon};(里面的值分别对应4,5,6,7)

特点:

①强作用域,其作用域限制在枚举类中,例如调用时Typename1::Light和Typename2::Light是不一样的

②枚举类对象不可以与整型隐式地互相转换

如下非法例子:

#include<iostream>
using namespace std;
enum class Side {Right, Left};
enum class Thing {Wrong, Right};
int main(void)
{
	Side s = Side::Right;
	Thing w = Thing::Wrong;
	cout<<(s==w)<<endl;		//编译错误,无法直接比较不同枚举类
	return 0;
}


样例:

#include<iostream>
#include<string>
using namespace std;
class ExamInfo
{
	public:
		ExamInfo(string name, char a): Name(name), mode(评级), level(a) {}
		ExamInfo(string name, bool a): Name(name), mode(通过情况), pass(a) {}
		ExamInfo(string name, int a): Name(name), mode(分数), score(a) {}
		void show();
	private:
		string Name;
		enum {评级, 通过情况, 分数} mode;		//这只算个枚举,不算做枚举类
		union
		{
			char level;	
			bool pass;
			int score;
		};
};

void ExamInfo::show()
{
	cout<<Name<< ": ";
	switch(mode)
	{
		case 评级:  cout<<level;  break;
		case 通过情况:  cout<<(pass?"PASS":"FAIL");  break;
		case 分数:  cout<<score;
	}
	cout<<endl;
}

int main(void)
{
	ExamInfo c1("English", 'B');
	ExamInfo c2("Calculus", true);
	ExamInfo c3("C++ Programming", 85);
	c1.show();
	c2.show();
	c3.show();
	return 0;
}