Part4 类与对象 4.6UML简介 4.7结构体 4.8联合体 4.9枚举类
4.6UML简介
三个基本部分:
事物Things
关系Relationships
图Diagrams
共享聚集:部分可以参加多个整体。
组成聚集(组合):整体拥有各个部分,整体与部分共存,如果整体不存在,部分也不存在。
4.7结构体
结构体是一种特殊形态的类:
1 与类的唯一区别:类的缺省访问权限是private,结构体的缺省访问权限是public
2 结构体存在的主要原因:与C语言保持兼容
什么时候用结构体而不用类:
1 定义主要用来保存数据、而没有什么操作的类型
2 人们习惯将结构体的数据成员设为公有,因此这时用结构体更方便
结构体的定义:
struct 结构体名称 { 公有成员 protected: 保护型成员 private: 私有成员 };
如果一个结构体的全部数据成员都是公共成员,并且没有用户定义的构造函数,没有基类和虚函数,这个结构体的变量可以用下面的语法形式赋初值:
类型名 变量名 = { 成员数据1初值, 成员数据2初值, …… };
//4-7用结构体表示学生的基本信息 #include<iostream> #include<iomanip> #include<string> using namespace std; struct Student{ int num; string name; char sex; int age; }; int main(){ Student stu = {9527, "Leo", 'M', 22}; cout << "Num: " << stu.num << endl; cout << "Name: " << stu.name << endl; cout << "Sex: " << stu.sex << endl; cout << "Age: " << stu.age << endl; return 0; }
4.8联合体
声明形式:
union 联合体名称 { 公有成员 protected: 保护型成员 private: 私有成员 };
特点:
1 成员共用同一组内存单元
2 任何两个成员不会同时有效
无名联合体:
union{ int i; float f; } //在程序中可以这样用 i = 10; f = 2.2;//这时i被冲掉了,因为i和f公用一个内存空间
//4-8使用联合体保存成绩信息,并且输出 #include<string> #include<iostream> 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 show(); }; void ExamInfo::show(){ cout << name << " : "; switch(mode){ case GRADE: cout << grade; break; case PASS: cout << (pass ? "PASS" : "FAIL"); break; case PERCENTAGE: cout << percent; break; } cout << endl; } int main(){ ExamInfo course1("English", 'B'); ExamInfo course2("Calculus",true); ExamInfo course3("C++ Programming", 100); course1.show(); course2.show(); course3.show(); return 0; }
4.9枚举类
枚举类型只能是整数的子集。枚举类则是强类型枚举。
枚举类定义:
enum class 枚举类型名: 底层类型 {枚举值列表};//默认底层类型为int
例:
enum class Type { General, Light, Medium, Heavy};//枚举常量为int enum class Type: char { General, Light, Medium, Heavy};//枚举常量为cahr enum class Category { General=1, Pistol, MachineGun, Cannon};//后面的枚举常量从1依次增加
枚举类的优势:
1 强作用域,其作用域限制在枚举类中。
如:使用Type的枚举值General,要带上类名。可以避免枚举值重名的问题。
Type::General
2 转换限制,枚举类对象不可以与整型隐式地互相转换。
3 可以指定底层类型
//4-9枚举类举例 #include<iostream> using namespace std; enum class Side{Right, Left}; enum class Thing{Wrong, Right};//不冲突 int main(){ Side s = Side::Right; Thing w = Thing::Wrong; cout << (s == w) << endl;//编译错误,无法直接比较不同枚举类型 return 0; }