5、結構體定義
結構體是用戶帶定義的類型,而結構聲明定義了這種類型的數據屬性。定義了類型后,便可以創建這種類型的變量,因此創建結構包括兩步。首先,定義結構描述——它描述並標記了能夠存儲在結構中的各種數據類型。然后按描述創建結構變量(街噶偶數據對象)。
5.1、定義結構后,便可以創建這種類型的變量了:
inflatable hat; inflatable woopie_cushion inflatable mainframe
如果熟悉C語言中的結構,則可能已經注意到了,C++允許在聲明結構變量省略關鍵字struct:
struct inflatable goose; //C語言結構體對象聲明,與C++結構體聲明都可以 inflatable Vincent; //只有C++結構體聲明可以用
由於hat的類型是inflatable,因此可以使用成員運算符(.)來訪問各個成員。例如,hat.volume指的是結構的volume成員,hat.privce,指的是price成員。
#include "stdafx.h" #include <iostream> //引用庫函數 using namespace std; //使用命名空間 struct inflatable { char name[20]; float volume; double price; }; int main() //主函數,程序執行的入口 { inflatable guest = //結構體初始化 { "Glorios Gloria", //這里的順序必須要與結構體定義順序一致 1.88, 29.99 }; //這里必須要加分號 inflatable pal = { "wanghong", 3.12, 32.99 }; cout << "Expand your guest list with" << guest.name; cout << "and" << pal.name << "!\n"; cout << "you can have both for $"; cout << guest.price + pal.price << ".\n"; cin.get(); return 0; //函數返回值 }
結果:
程序說明:
5.2、結構體初始化
與數組一樣,C++也支持將列表初始化用於結構,且等號(=)是可選的:
inflatable duck {“Daphne”,0.12,6.64}
其次如果大括號為包含任何東西,各個成員將被設置為零,
inflatable duck {}; //結構體內所有值為零 //最后,不允許縮窄變換。
5.3、結構體將string 類作為成員
#include <string> struct inflatable { std::string name; //一定要讓結構定義能夠訪問名稱空間std float volume: double price; };
5.4、其他結構類型
C++使用戶定義的類型與內置類型盡可能的相似,例如,可以將結構體作為參數傳遞給函數,也可以讓函數返回一個結構體。另外,還可以使用賦值運算符(=)將結構體賦值給另一個同類型的結構。這樣結構中每個成員都將被設置為另一個結構中相應成員的值,即使是數組。這種賦值稱為成員賦值
inflatable doubj { “asfdasf”, 0.52, 12.51 } inflatable choice; choice = doubj;//成員賦值
可以同時完成結構體創建和創建結構體對象的工作(將變量名放在結束括號的后面即可):
struct perks { int key_number; char car[12]; }mr_smith,ms_jones;//兩個結構體對象。
甚至可以初始化以這種方式創建的變量:
struct perks { int key_number; char car[12]; }mr_smith = { 7, "dsfasdasd" };
然而,將結構體定義和變量聲明分開,可以是程序更容易於閱讀與理解。
5.5、結構數組
inflatable—結構包含一個數組(name)。也可以創建元素為結構體的數組,方法和創建基本類型數組完全相同。例如,要創建一個包含100個inflatable結構的數組,可以這樣做:
inflatable gifts[100];//100 個inflatable結構體數組
這樣gifts將是一個inflatable數組,其中的每個元素(如gifts[0]或gifts[99])都是inflatable對象可以與成員運算符一起使用。
cin>>gifts[0].volume; cout<<gifts[99].price<<endl;
記住gifts本身是一個數組,而並不是結構體,因此像gifts。price這樣的表述是無效的。
#include "stdafx.h" #include <iostream> //引用庫函數 using namespace std; //使用命名空間 struct inflatable { char name[20]; float volume; double price; }; int main() //主函數,程序執行的入口 { inflatable guests[2]= { {"Bambi",0.5,21.55}, {"Goodzilla",2000,654.214} }; cout << "The guests" << guests[0].name << "and" << guests[1].name << "\nhave a combined volume of " << guests[0].volume + guests[1].volume << " cubic feet.\n"; cin.get(); return 0; //函數返回值 }
結果:
5.6、結構體中的位字段
與C語言一樣,C++也允許指定占用特定位數的結構成員,這使得創建於某個硬件設備上的寄存器對應的數據結構非常方便。字段的類型為整型或枚舉類型,接下來是冒號,冒號后面是一個數字,它指定了使用的位數。可以使用沒有名稱的字段來提供間距。每個成員都被稱為字段。下面是一個例子:
struct torgle_register { unsigned int SN : 4; //4 bit 為SN的值 unsigned int : 4; //4 bit為空白的占位 bool goodIn :1; bool goodTorgle : 1; }
初始化結構體,和訪問結構體與標准方法相同。