struct關鍵字是用來定義一個新的類型,這個新類型里面可以包含各種其他類型,稱為結構體。
1. 什么是結構體
結構體(struct)是一種自定義的數據類型,就是把一組需要在一起使用的數據元素組合成一個新的類型。結構體的作用就是封裝,以方便地使用這些封裝到一起的屬性。
新的類型與C++中基本類型int,庫類型string一樣。C++的關鍵字struct是從C語言中的struct繼承過來的,它們之間有區別與聯系。
2. C語言的struct:
C語言可以使用結構體struct來存放一組不同類型的數據,在C語言中結構體只能包含變量,不能包含函數,定義格式為:
struct 結構體名{
結構體所包含的變量;
};
在定義結構體時,不能在結構體內初始化包含的那些變量,因為結構體聲明只是創建一個新的數據類型,還不存在這種類型的變量實體。
>> 注意:花括號{}后面的分號';'不可缺少,因為它是一條定義語句。
例如,我們想定義一個與學生考試成績有關的數據結構類型,方便我們的管理,那么新類型所包含的應該有學生的名稱,年齡,學號等信息,可以寫為如下:
struct Student{
char *name; //姓名
int age; //年齡
int school_id; //學號
};
注意:各個變量都不能在結構體內初始化,因為結構體聲明只是創建一個新的數據類型,還不存在這種類型的變量實體。
這樣就定義了一個新的類型Student,與基本類型int,double或者庫類型string一樣,可以用這個新類型去定義變量。比如我們定義一個整型變量,定義一個雙精度浮點數,再定義2個學生信息,
int a = 0;
double b = 1.0;
//C語言要求結構體在定義變量時要加上 struct Student
struct Student xiaoming("xiaoming", 10, 10001), jim('jim', 9, 10002); //直接在定義變量 xiaoming,jim 時提供賦值
或者定義變量時不提供初始值,后續再逐個給變量的成員賦值,如下:
struct Student xiaoming, jim; //定義了兩個變量 xiaoming,jim
xiaoming.name = "xiaoming";
xiaoming.age = 10;
xiaoming.school_id = 10001;
...
還有2種方式 給結構體類型Student定義變量,如下,
第一種:將變量放在結構體定義的最后即可。同時也可以提供賦值。
struct Student{
char *name; //姓名
int age; //年齡
int school_id; //學號
}xiaoming, jim = {"jim", 9, 10002}; //將變量放在結構體定義的最后即可(大括號之后、分號之前)。同時也可以提供賦值。
第二種:
如果只需要 `xiaoming`, `jim` 兩個變量,后面不需要再使用該結構體的名稱去定義其他變量,那么在定義時也可以不給出結構體名稱。
這樣做省略了結構體的名稱,書寫簡單,但是因為沒有結構體名,后面就沒法用該結構體定義新的變量。如下所示:
struct {
char *name; //姓名
int age; //年齡
int school_id; //學號
}xiaoming, jim = {"jim", 9, 10002}; //省略了結構體的名稱,后續就無法再用此結構體定義變量。
使用結構體內定義的成員時,通過點號.操作,例如,
xiaoming.name = "xiaoming";
xiaoming.age = 12;
就完成了對變量xiaoming的name與age的賦值。
以上就是C語言的struct結構體的主要定義方法與賦值,更多的詳細內容可以參考 C語言結構體詳解http://c.biancheng.net/c/100/。
3. C++的struct
C++的關鍵字struct是從C語言中的struct繼承過來的,但是與C語言中要求struct只能包含成員變量不一樣。C++中,struct類似於class,既可以包含成員變量,又可以包含成員函數。
C++的struct與C語言的不同之處有:
1.C++的結構體在定義變量時,結構體名稱的前面可以省略struct,例如 定義了Student結構體類型,
struct Student{
char *name; //姓名
int age; //年齡
int school_id; //學號
};
在定義結構體時,不能在結構體內初始化包含的那些變量,因為結構體聲明只是創建一個新的數據類型,還不存在這種類型的變量實體。
Student xiaoming, jim; //C++允許省略struct,在Student前面可以不加struct。定義結構體Student類型的變量xiaoming,jim。
struct Student xiaoming, jim; //C風格的變量定義,在C++里面也沒有問題,兼容。
2.結構體的初始化:使用初始化列表或構造函數
初始化列表的方式初始化:
Student stu1 = {"James", 15, 20190101};
這就定義了一個Student類型的變量stu1,並且以列表的形式為其中的變量提供了初始值。
除了使用初始化列表之外,C++中還可以使用構造函數來初始化結構體成員變量,這和初始化類class成員變量是相同的。
與類class的構造函數一樣,結構體的構造函數必須是與結構體名稱相同的公共成員函數,並且沒有返回類型。因為默認情況下,所有結構體成員都是公開的,所以不需要使用關鍵字 public。
初始化構造函數的示例,
struct Student{
char *name; //姓名
int age; //年齡
int school_id; //學號
//初始化構造函數 名稱與結構體名稱相同,且無返回值。默認的初始化。
Student( /* args */ ){
name = "test";
age = 100;
school_id = 000001;
}
};
雖然結構體可以包含成員函數,但盡量不要這樣做。盡量只把結構體當作數據類型,而在類class里面使用成員函數。
C++中的struct和class基本是通用的,有幾個不同之處:
> 使用 class 時,類中的成員默認都是 private 屬性的;而使用 struct 時,結構體中的成員默認都是 public 屬性的。
> class 繼承默認是 private 繼承,而 struct 繼承默認是 public 繼承(《C++繼承與派生》一章會講解繼承)。
> class 可以使用模板,而 struct 不能(《模板、字符串和異常》一章會講解模板)。
在編寫C++代碼時,建議使用 class 來定義類,而使用 struct 來定義結構體,這樣做語義更加明確。
其他的一些C++結構體的知識:
[c++結構體] https://www.cnblogs.com/zhengfa-af/p/8144786.html
[c++結構體完全攻略] http://c.biancheng.net/view/1407.html
[c++ class和struct的區別] http://c.biancheng.net/view/2235.html
