假設要存儲有關籃球運動員的信息,則可能需要存儲他(她)的姓名、工資、身高、體重、平均得分、命中率、助攻次數等。希望有一種數據格式可以將所有這些信息存儲在一個單元中。結構是一種比數組更靈活的數據格式,因為同一個結構可以存儲多種類型的數據,這使得能夠將有關X的信息放在一個結構中,從而將數據的表示合並到一起。如果要跟蹤整個球隊,則可以使用結構數組。結構也是C++ OPP堡壘(類)的基石。
結構式用戶定義的類型,而結構聲明定義了這種類型的數據屬性。定義了類型後,便可以創建這種類型的變量。因此創建結構包括兩步。首先,定義結構描述——它描述並標記了能夠存儲在結構中的各種數據類型。然後按描述創建結構變量(結構數據對象)。
關鍵字struct表明,這些代碼定義的是一個結構的布局。標識符inflatable是這種數據格式的名稱,以此新類型的名稱為inflatable。大括號中包含的是結構存儲的數據類型的列表,其中每個列表項都是一條聲明語句。
創建變量的代碼
struct inflatable gooose;//C語言創建這種類型的變量 inflatable gooose;//C++允許在聲明結構變量時省略關鍵字struct
inflatable hat;
由於hat的類型為inflatable,因此可以使用成員運算符(.)來訪問各個成員。例如,hat.volume指的是結構的volume成員。由於volume成員被聲明為float類型,以此hat.volume相當於是float類型的變量,可以像使用常規float變量那樣來使用它。總之hat是一個結構,hat.volume是一個float變量。順便一說一句,訪問類成員函數的方式是從訪問結構成員變量的方式衍生而來的。
局部結構聲明和外部結構聲明
變量也可以在函數內部和外部定義,C++不提倡使用外部變量,但提倡使用外部結構聲明。
結構初始化
inflatable guest= { "Glorious Gloria", 1.88; 29.99 }; inflatable guest= {"Glorious Gloria",1.88;29.99};
結構可以將string類作為成員嗎?
代碼
#include<string> struct inflatable { std::string name; float volume; double price; };
答案是肯定的,只要使用的編譯器支持對以string對象作為成員的結構進行初始化。
一定要讓結構定義能夠訪問名稱空間std。為此,可以將編譯指令using移到結構定義之前;也可以像上面那樣,將neme的類型聲明為std::string。
可以同時完成定義結構和創建結構變量的工作。為此,只需將變量名放在結束括號的後面即可。甚至可以初始化這種方式創建的變量。然而,將結構定義和變量聲明分開,可以使程序更易於閱讀和理解。還可以聲明沒有名稱的結構類型,方法是省略名稱,同時定義一種結構類型和一個這種類型的變量:
struct { int x; int y; }position;//一個結構變量
結構數組
要創建包含100個inflatable結構的數組,可以這樣做:
inflatable gifts[100];
這樣,gifts本身將是一個inflatable數組,其中的每個元素(如gifts[0]或gifts[99])都是inflatable對象,可以與成員運算符一起使用:
cin>>gifts[0].volume; cout<<gifts[99].price<<endl;
記住,gifts本身是一個數組,而不是結構,因此像gifts.price這樣的表述是無效的。
要初始化結構數組,可以結合使用初始化數組的規則和初始化結構的規則。由於數組中的每個元素都是結構,因此可以使用結構初始化的方式來提供它的值。因此最終結構為一個被括在花括號中、用逗號分隔的值列表,其中每個值本身又是一個被括在花括號中、用逗號分隔的值列表”
inflatable guests[2]= { {"Bambi",0.5,21.99}, {"Godzilla",2000,565.99} };
結構中的位字段
struct torgle_register { unsigned int SN:4; unsigned int:4; bool goodIn:1; bool goodTorgle:1; };
torgle_register tr={14,true,false}; if(tr.goodIn)
位字段通常用在低級編程中。一般來說,可以使用整形和按位運算符來替代這種方式。