联合体
联合体与类和结构体的差别是存储空间的公用,成员之间共用同一个内存单元,单元的大小由成员中最大的数据类型决定,两个成员不会同时生效
union //构造一个联合体,里面放了三种积分方式,每次只能用一种;
{
char grade;//按等级积分;
bool pass;//按是否通过积分
int percent;//按百分之成绩积分;
其定义与结构体相似(第一个不表明为public型),但是是以union开头
好处:即省了空间,又避免了给重复的不同形式的数据
#include<iostream>
#include<string>
using namespace std;
class examinfo
{
private:string name;
enum { GRADE, PASS, PERCENTAGE } mode;//这是一个枚举类,用来保存积分方式
union //构造一个联合体,里面放了三种积分方式,每次只能用一种;
{
char grade;//按等级积分;
bool pass;//按是否通过积分
int percent;//按百分之成绩积分;
};
public:examinfo(string name, char grade):
name(name), mode(GRADE), grade(grade){}
examinfo(string name, bool pass ):
name(name),mode(PASS),pass(pass){}
examinfo(string name, int percent) :
name(name), mode(PERCENTAGE), percent(percent){}
void showegrade();
};
void examinfo::showegrade()//定义输出函数;
{
switch (mode)
{
case examinfo::GRADE:
cout <<name<<":"<< grade << endl;
break;
case examinfo::PASS:
cout << name << ":" <<(pass ? "PASS!" : "FALT!")<<endl;
break;
case examinfo::PERCENTAGE:
cout << name << ":" <<percent<< endl;
break;
default:
break;
}
}
int main()
{
examinfo student1("english",'A');//注意,这里是字符形式的A;不然会跳开第一个构造函数
examinfo student2("math", true);
examinfo student3("c++ progame", 100);
student1.showegrade();
student2.showegrade();
student3.showegrade();
}
枚举类
上述代码就有一个小小的枚举
enum { GRADE, PASS, PERCENTAGE } mode
上面那个是c中的一个枚举
下面是枚举类:
用的话要这样用:前面要加个类名(c中不用)可以避免重名
枚举类型会自动转换为整数类型,所以他的类型定义不是很严格;
在定义枚举类时可以定义常量的值,也可以对类型指定底层类型
#include<iostream>
#include<string>
using namespace std;
enum class type1 { A, B };//A,B都是不确定的整数,因为没有赋值,且默认底层为int
enum class type2 {A,B};
int main()
{
type1 c = type1::A;
type1 d = type1::B;
cout << (c == d) << endl;
}
无法比较两个不同的枚举类:
type1 c = type1::A;
type2 d = type2::B;
cout << (c == d) << endl;//错误,两个枚举类型不一样