- 結構體
如果我想要表示某種物體的屬性,如表示一個人(它包含了姓名、年齡、身高、體重等),這時候我就可以使用結構體來表示這種屬性。比如說我想表示一個人,那麼我可以創建如下的結構體:
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;
}
我們應該熟練的使用結構體、共用體以及枚舉,這能讓我們的代碼更上一層,達到生活與代碼的合一。