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