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;
}

 

posted @ 2017-12-01 17:10  LeoSirius  阅读(299)  评论(0编辑  收藏  举报