OSX + Xcode + C++ (8)

特殊的类

1.结构体

c语言中也有结构体的概念,但是c++中的结构体与c语言的结构体有很大差别,首先,c++的结构体是一种特殊的类。但是,结构体和类也有区别:
1.类的成员的默认访问属性是private,也就是说,如果不指定访问权限,那么成员就是private;而结构体的默认访问属性是public。
2.如果一个类仅仅有一组属性(数据),而没有操作,那么就用结构体来定义,并且便于访问。
当然,这并不是说结构体中不能有成员函数,事实上,c++允许结构体中定义成员函数。
下面我们来看一个典型的结构体的定义和使用:

//
//  main.cpp
//  StructAndUnion
//
//  Created by Evelyn on 2018/8/5.
//  Copyright © 2018年 Evelyn. All rights reserved.
//

#include <iostream>
using namespace std;
//struct defination, default member variables are public
struct Student {
    string name;
    int age;
    int sex;
};
int main(int argc, const char * argv[]) {
    //student object declaration
    Student s = {"Daxiong", 1, 2};
    //access object member variables
    cout << s.name <<" ";
    cout << s.age <<" ";
    cout << s.sex <<" ";
    return 0;
}

2.联合体

联合体和结构体和类也很相似,但它的机制是为了解决共享存储的问题,也就是说,节省内存空间。联合体的成员默认访问控制也是public。
联合体的特点是:
1. 所有的成员变量共用相同的内存单元
2. 同一时刻,联合体的成员最多只有一个是存在的。

2.1 联合体的语法结构

比如说学生考试的计分,有的课是按百分制,有的课是按等级制,还有的课只有通过不通过,我们知道,一门课只能有一种计分方式,因此可以用联合体来解决这个问题:

union Transcript {
    //in percentage
    int percent;
    //in A\B\...
    char grade;
    //in pass or fail
    bool pass;
};

既然是节省内存,我们来看一下上述结构体对象的内存分配。首先,联合体中成员变量占据内存空间最大的是int型变量,是4个字节,char型和bool型变量都是一个字节,因此一个联合体对象首先会分配4个字节。如果联合体对象中存入的有效数据是百分制成绩,自然会占用全部的4个字节;这之后,假如更新了成绩为等级制,旧的成绩就被冲掉了,新的成绩占用4个字节中的第一个。
这里写图片描述

2.2 联合体的应用举例

我们来看这个例子,就是2.1小节的联合体的应用。ExamInfo类中定义了三个成员变量:课程名、计分方式和成绩,其中计分方式和成绩是一一对应的,因为我们在读取成绩时,必须依赖联合体中成员变量的名来读取,也就是说,如果没有这个计分方式与它对应,我们不知道联合体中有效存在的成员变量是哪一个,也就没办法去读取数据。同样的,也需要三个构造函数,来对ExamInfo类的对象进行初始化。

//
//  main.cpp
//  StructAndUnion
//
//  Created by Evelyn on 2018/8/5.
//  Copyright © 2018年 Evelyn. All rights reserved.
//

#include <iostream>
using namespace std;
//defination of union transcript
union Transcript{
    //in percentage
    int percent;
    //in A\B\...
    char grade;
    //in pass or fail
    bool pass;
};
//defination of class ExamInfo
class ExamInfo {
private:
    string name;
    enum {Perct, Grade, Pass} Mode;
    Transcript t;
public:
    ExamInfo(string newName, int newT );
    ExamInfo(string newName, char newT ) ;
    ExamInfo(string newName, bool newT );
    void show();
};
//three different constructors
ExamInfo::ExamInfo(string newName, int newT ) {
    name = newName;
    Mode = Perct;
    t.percent = newT;
};
ExamInfo::ExamInfo(string newName, char newT ) {
    name = newName;
    Mode = Grade;
    t.grade = newT;
};
ExamInfo::ExamInfo(string newName, bool newT ) {
    name = newName;
    Mode = Pass;
    t.pass = newT;
};
//output depends on Mode
void ExamInfo::show() {
    cout << name <<": ";
    switch(Mode){
        case Perct: cout << t.percent << endl; break;
        case Grade: cout << t.grade << endl; break;
        case Pass: cout << t.pass << endl; break;
    }
}
int main(int argc, const char * argv[]) {
    //Exam object defination
    ExamInfo examInfo("c++" , 60);
    //access object member variables
    examInfo.show();
    return 0;
}

3. 枚举类

猜你喜欢

转载自blog.csdn.net/qq_42857385/article/details/81429982