結構體、共用體、枚舉

  • 結構體

如果我想要表示某種物體的屬性,如表示一個人(它包含了姓名、年齡、身高、體重等),這時候我就可以使用結構體來表示這種屬性。比如說我想表示一個人,那麼我可以創建如下的結構體:

struct person
{   
    char name[20];
    int age;
    unsigned long id;
    float high;
};

這時候我就創建一種新的變量,它能夠表示多種不同的信息,可以說結構體是程序思想上的進步,如果沒有結構體,那麼程序將失去靈魂。那麼在 C 語言中,聲明結構體的方法可能是這樣的:

struct person info; // C type

這種語法,如果是在項目中,可能會變得糟糕,因爲它需要寫大量的 struct 關鍵字(雖然可以使用 typedef 來去除這種麻煩)。不過在 C++ 中,C++ 爲我們提供了更好的語法,可以直接省去 struct 關鍵字,來創建一個或多個結構體變量。

person info; // C++ type

除了創建結構體變量外,還需要訪問結構體變量,方法其實也很簡單,只需要使用成員運算符 (.) 來訪問各個成員即可。

info.name
info.age
info.id
info.high

除此之外,結構體還支持在定義、創建和賦值同時完成,這和普通的變量是一樣的。

struct person
{
    char name[20]
    int age;
    unsigned long id;
    float high;
} mr_arial, mr_jack;

甚至我可以這樣創建變量,這種創建與賦值的方式確實很漂亮,有種技驚四座的感覺。

struct person 
{
    char name[20];
    int age;
    unsigned long id;
    float high;
} mr_jack = 
{
    "Jack",
    16,
    5201314,
    172.5
};
  • 結構中的位字段

C/C++ 都支持佔用特定位數的結構成員,這種結構的支持,開發者能夠方便創建與某個硬件寄存器對應結構。比如嵌入式開發中,使用這種結構就非常的方便。

struct car
{
    unsigned int id : 4; 
    unsigned int : 4; // Saved
    bool is_open : 1;
    bool is_boor : 4;
};
  • 共用體

共用體本質上就是結構體,不過與結構體的區別是它能夠節省一定的空間,比如本來需要16字節的信息,我能夠給它省到8字節。比如我想做一個學生管理系統,而我又要區分老師與學生,這時候我就可以這麼做:

#define MAX_PERSON 1000
struct school
{
    char name[20];
    int age;
    bool sex;
    int id;
    union type 
    {
        float score;
        char subject[20];
    } var_type;
} info[MAX_PERSON];

我們可以使用 id 來表示某個人是學生還是老師,如果是學生就顯示總分,如果是老師就顯示所教的科目。

enum rank {student, teacher, director, headmaster};
...
for (int i = 0; i < MAX_PERSON; i++) {
    if (info[i].id == student)
        cout << info[i].score << endl;
    else 
        cout << info[i].subject << endl;
}

這裏我使用 enum 來枚舉學校人員的等級,如果是 id 是 0,就會輸出成績,否則輸出科目。

  • 枚舉

C++ 提供了一種創建符號常量的方法,這種方法能夠代替 const。它還允許創建新的類型,這種方法的存在能夠使程序的編寫變得容易,且更加的方便維護。

enum rank {student, teacher, director, headmaster};

比如以上這段代碼,它使得 rank 稱爲新類型的名稱,rank 被稱爲枚舉。且將 student、teacher、director、headmaster 做爲符號常量,自動賦值(範圍是 0 ~ 3)。跟其他類型一樣,可以用 rank 來聲明變量,並使用它。

rank lbs;

我們也可以對它進行賦值,運算這些操作。

lbs = student; // 0
lbs = student + director; // 0 + 2

由於 enum 枚舉實質上是整數在進行運算,我們也可以使用 int ,如果 int 的值是有效的話,我們可以進行強制轉換爲 enum 類型。

int rks; 
rks = 3;
lbs = rank(rks);

除此之外,我們還可以手動顯示設置 enum 變量的值,讓它來表達一些特殊的含義。

enum rank {student = 1, teacher = 2, director = 4, headmaster = 8};

我們還能夠創建多個值相同的變量,雖然很少用到。

enum queue {zero, null = 0, one, number_one = 1}

這樣做法的好處是我們能夠使它歸類,比如定義一個材料的序列,木頭做的定義一列,金屬做的定義一列。這裏我使用一個小例子來幫助我理解它們在程序中的意義。

// select-role.cpp 
#include <iostream>
#include <string>
using namespace std;
enum character {Orc, Psychic, Swordsman, Archer};
const char *part_names[] = {"Orc", "Psychic", "Swordsman", "Archer"};
struct 
{
    string g_names; // game names
    int r_type;     // role type
} role;

int main()
{    
    cout << "Enter your the game names: ";
    getline(cin, role.g_names);
    cout << "Enter your the game role (0-3): "; 
    (cin >> role.r_type).get();
    
    cout << "Welcome to DayBreak New Action, " <<
    role.g_names << endl;
    cout << "You role is " << part_names[role.r_type] << endl;
    return 0; 
}

我們應該熟練的使用結構體、共用體以及枚舉,這能讓我們的代碼更上一層,達到生活與代碼的合一。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章