结构体:
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;
}