C\C++中的 struct 關鍵字詳解


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++中的structclass基本是通用的,有幾個不同之處:

> 使用 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM