C++ Primer Plus學(xué)習(xí)筆記之復(fù)合類(lèi)型(上)

前言

個(gè)人覺(jué)得學(xué)習(xí)編程最有效的方法是閱讀專(zhuān)業(yè)的書(shū)籍,通過(guò)閱讀專(zhuān)業(yè)書(shū)籍可以構(gòu)建更加系統(tǒng)化的知識(shí)體系亏镰。

一直以來(lái)都很想深入學(xué)習(xí)一下C++,將其作為自己的主力開(kāi)發(fā)語(yǔ)言。現(xiàn)在為了完成自己這一直以來(lái)的心愿医寿,準(zhǔn)備認(rèn)真學(xué)習(xí)《C++ Primer Plus》。

為了提高學(xué)習(xí)效率蘑斧,在學(xué)習(xí)的過(guò)程中將通過(guò)發(fā)布學(xué)習(xí)筆記的方式糟红,持續(xù)記錄自己學(xué)習(xí)C++的過(guò)程。

本篇前言

本章首先將介紹除類(lèi)以外的所有復(fù)合類(lèi)型乌叶,以及將介紹newdelete及如何使用它們來(lái)管理數(shù)據(jù)盆偿。另外,還將簡(jiǎn)要地介紹string類(lèi)准浴,它提供了另一種處理字符串的途徑事扭。

一、數(shù)組

數(shù)組(array)是一種數(shù)據(jù)格式乐横,能夠存儲(chǔ)多個(gè)同類(lèi)型的值求橄。

要?jiǎng)?chuàng)建數(shù)組今野,可使用聲明語(yǔ)句。數(shù)組聲明應(yīng)指出以下三點(diǎn):

  • 存儲(chǔ)在每個(gè)元素中的值的類(lèi)型
  • 數(shù)組名
  • 數(shù)組中的元素?cái)?shù)

聲明數(shù)組的通用格式如下:

typeName arrayName[arraySize]

表達(dá)式arraySize指定元素?cái)?shù)目罐农,它必須是整型常數(shù)(如10)或const值条霜,也可以是常量表達(dá)式(如8*sizeof(int)),即其中所有的值在編譯時(shí)都是已知的。
具體示例如下代碼:

short months[12];

通過(guò)以上代碼涵亏,聲明了一個(gè)名為months的擁有12個(gè)short類(lèi)型值的數(shù)組宰睡。

通過(guò)使用下標(biāo)或索引可以單獨(dú)訪(fǎng)問(wèn)數(shù)組元素。C++規(guī)定數(shù)組從0開(kāi)始編號(hào)气筋。C++使用帶索引的方括號(hào)表示法來(lái)指定數(shù)組元素拆内。例如:months[0]months數(shù)組的第一個(gè)元素,months[11]months數(shù)組的最后一個(gè)元素宠默。因?yàn)殚_(kāi)始數(shù)字為0麸恍,加上元素?cái)?shù)量12個(gè),最后一個(gè)元素比總數(shù)量少1搀矫。

在編寫(xiě)代碼的過(guò)程中要注意下標(biāo)值是否有效抹沪,例如:months[-1]months[12]就是無(wú)效的下標(biāo)值瓤球,這可能會(huì)導(dǎo)致程序出現(xiàn)異常采够。

接下來(lái)我們根據(jù)程序清單4.1了解數(shù)組的一些屬性,包括聲明數(shù)組冰垄、給數(shù)組元素賦值以及初始化數(shù)組:

// arrayone.cpp -- 小型整數(shù)數(shù)組
#include <iostream>
int main()
{
    using namespace std;
    int orange[2]; // 創(chuàng)建有2個(gè)元素的數(shù)組
    orange[0] = 15; // 賦值給第1個(gè)元素
    orange[1] = 28;
    int orangeCosts[2] = {3, 2}; // 創(chuàng)建并初始化數(shù)組
    cout << "橙子的總數(shù)量 = ";
    cout << orange[0] + orange[1] << endl;
    cout << "第一個(gè)包裝里有" << orange[0] << "個(gè)橙子蹬癌,";
    cout << "其中每個(gè)橙子的成本為" << orangeCosts[0] << "元。\n";
    cout << "第二個(gè)包裝里有" << orange[1] << "個(gè)橙子虹茶,";
    cout << "其中每個(gè)橙子的成本為" << orangeCosts[1] << "元逝薪。\n";
    int total = orange[0] * orangeCosts[0] + orange[1] * orangeCosts[1];
    cout << "全部橙子的總成本為" << total << "元。\n";
    cout << "\norange數(shù)組的長(zhǎng)度 = " << sizeof orange;
    cout << " bytes.\n";
    cout << "第一個(gè)數(shù)組的長(zhǎng)度 = " << sizeof orange[0];
    cout << " bytes.\n";
    return 0;
}

運(yùn)行結(jié)果如下:

橙子的總數(shù)量 = 43
第一個(gè)包裝里有15個(gè)橙子蝴罪,其中每個(gè)橙子的成本為3元董济。
第二個(gè)包裝里有28個(gè)橙子,其中每個(gè)橙子的成本為2元要门。
全部橙子的總成本為101元虏肾。
orange數(shù)組的長(zhǎng)度 = 8 bytes.
第一個(gè)數(shù)組的長(zhǎng)度 = 4 bytes.

1、程序說(shuō)明

該程序首先創(chuàng)建一個(gè)名為orange包含2個(gè)int類(lèi)型元素的數(shù)組欢搜。然后我們根據(jù)下標(biāo)值分別對(duì)2個(gè)元素進(jìn)行了賦值封豪。因?yàn)?code>orange的每個(gè)元素都是int類(lèi)型,因此能夠?qū)?shù)值賦值給元素炒瘟、并將它們相加和相乘吹埠。

程序在給數(shù)組中元素賦值時(shí),采用了兩種方式,分別是通過(guò)下標(biāo)值對(duì)每個(gè)元素進(jìn)行賦值和提供一個(gè)用逗號(hào)分隔的值列表(初始化列表),并將它們用花括號(hào)括起即可缘琅。

接下來(lái)粘都,程序通過(guò)下標(biāo)值對(duì)數(shù)組中元素進(jìn)行訪(fǎng)問(wèn)并進(jìn)行一些計(jì)算。

sizeof運(yùn)算符返回類(lèi)型或數(shù)據(jù)對(duì)象的長(zhǎng)度(單位為字節(jié))刷袍。將sizeof運(yùn)算符用于數(shù)組名翩隧,得到的將是整個(gè)數(shù)組中的字節(jié)數(shù),如果將sizeof用于數(shù)組元素呻纹,則得到的將是元素的長(zhǎng)度(單位為字節(jié))堆生。

2、數(shù)組的初始化規(guī)則

C++只有在定義數(shù)組時(shí)才能使用初始化居暖,此后只能通過(guò)下標(biāo)值分別對(duì)單個(gè)元素進(jìn)行賦值:

int orangeCosts[2] = {3, 2}; // 有效
int bananaCosts[2]; // 有效
bananaCosts[2] = {7,10}; // 無(wú)效
bananaCosts = orangeCosts; // 無(wú)效
bananaCosts[0] = 7; // 有效
bananaCosts[1] = 10; // 有效

初始化數(shù)組時(shí)顽频,提供的值可以少于數(shù)組的元素?cái)?shù)目藤肢。例如太闺,下面的語(yǔ)句只初始化orangeCosts數(shù)組的第一個(gè)元素:

int orangeCosts[2] = {3}; // 有效

以上代碼,將第一個(gè)元素賦值為3嘁圈,第二個(gè)元素編譯器默認(rèn)賦值為0省骂。

如果初始化數(shù)組時(shí)方括號(hào)內(nèi)([]) 為空,C++編譯器將計(jì)算元素個(gè)數(shù)最住。例如:

int appleCosts = {2 , 5}; 

以上代碼钞澳,編譯器將使appleCosts數(shù)組包含2個(gè)元素。

3涨缚、C++11數(shù)組初始化方法

C++11將使用大括號(hào)的初始化(列表初始化)作為一種通用初始化方式轧粟,可用于所有類(lèi)型。C++11在以前列表初始化的基礎(chǔ)上增加了一些新的功能:

  • 初始化數(shù)組時(shí)脓魏,可省略等號(hào) (=):
int appleCosts[2] {2 , 5}; 
  • 可不在大括號(hào)內(nèi)包含任何東西兰吟,這將把所有元素都設(shè)置為零
int appleCosts[2] {}; 
  • 列表初始化禁止縮窄轉(zhuǎn)換:
int appleCosts[2] {2.0 , 5}; 

在上述代碼不能通過(guò)編譯,因?yàn)閷⒏↑c(diǎn)數(shù)轉(zhuǎn)換為整型是縮窄操作茂翔,即使浮點(diǎn)數(shù)的小數(shù)點(diǎn)后面為零混蔼。

二、字符串

字符串是存儲(chǔ)在內(nèi)存的連續(xù)字節(jié)中的一系列字符珊燎。C++處理字符串的方式有兩種:1惭嚣、繼承自C語(yǔ)言的C風(fēng)格字符串;2悔政、基于string類(lèi)庫(kù)的方法晚吞。

C風(fēng)格字符串具有一種特殊的性質(zhì):以空字符(null character)結(jié)尾,空字符被寫(xiě)作\0谋国,其ASCII碼為0载矿,用來(lái)標(biāo)記字符串的結(jié)尾,如下代碼:

char hi[2]={'h', 'i' };//不是字符串
char hello[6]={'h',  'e',  'l',  'l',  'o', '\0'};//是字符串

以上方法初始化字符串的方法較為復(fù)雜,可以使用引號(hào)括起字符串即可闷盔。這種字符串被稱(chēng)為字符串常量(string constant)或字符串字面值(string literal)弯洗,如下代碼:

char hello[6]="hello";
char good[]="good";//讓編譯器計(jì)算長(zhǎng)度

用引號(hào)括起的字符串隱式地包括結(jié)尾的空字符,因此不用顯式地包括它逢勾。

C++對(duì)字符串的長(zhǎng)度沒(méi)有限制牡整,處理字符串的函數(shù)根據(jù)空字符的位置判斷字符串是否結(jié)束。在確定存儲(chǔ)字符串所需的最短數(shù)組時(shí)溺拱,需要將結(jié)尾的空字符計(jì)算在內(nèi)逃贝。

注意:字符串常量(使用雙引號(hào))不能與字符常量(使用單引號(hào))互換。

1迫摔、拼接字符串常量

有時(shí)候沐扳,字符串很長(zhǎng),無(wú)法放到一行中句占。C++允許拼接字符串字面值沪摄,即將兩個(gè)用引號(hào)括起的字符串合并為一個(gè)。事實(shí)上纱烘,任何兩個(gè)由空白(空格杨拐、制表符和換行符)分隔的字符串常量都將自動(dòng)拼接成一個(gè)。
因此擂啥,哄陶,下面所有的輸出語(yǔ)句都是等效的:

cout << "hi i am " "kangkang\n";
cout << "hi i am " "kangkang\n";
cout << "hi i am "
    "kangkang\n";

注意,拼接時(shí)不會(huì)在被連接的字符串之間添加空格哺壶,第二個(gè)字符串的第一個(gè)字符將緊跟在第一個(gè)字符串的最后一個(gè)字符 (不考慮\0)后面屋吨。第一個(gè)字符串中的\0字符將被第二個(gè)字符串的第一個(gè)字符取代。

2山宾、在數(shù)組中使用字符串

要將字符串存儲(chǔ)到數(shù)組中至扰,最常用的方法有兩種將數(shù)組初始化為字符串常量、將鍵盤(pán)或文件輸入讀人到數(shù)組中塌碌。代碼如下:

// strings.cpp -- 在數(shù)組中存儲(chǔ)字符串
#include <iostream>
#include <cstring> // strlen()函數(shù)所在頭文件
int main()
{
    using namespace std;
    const int Size = 15;
    char name1[Size]; // 空數(shù)組
    char name2[Size] = "Jane"; // 初始化數(shù)組
    cout << "你好渊胸!我是" << name2;
    cout << "!請(qǐng)問(wèn)你叫什么名字台妆?\n";
    cin >> name1;
    cout << "我叫" << name1 << "翎猛,我的名字占";
    cout << strlen(name1) << "個(gè)字符";
    cout << ",在存儲(chǔ)數(shù)組中占" << sizeof(name1) << "字節(jié)接剩。\n";
    cout << "第一個(gè)字符是" << name1[0] << "切厘。\n";
    name2[1] = '\0'; // 設(shè)置空字符串
    cout << "很高興認(rèn)識(shí)你,我的第一個(gè)字符是";
    cout << name2 << endl;
    return 0;
}

運(yùn)行結(jié)果如下:

你好懊缺!我是Jane疫稿!請(qǐng)問(wèn)你叫什么名字培他?
Kang
我叫Kang,我的名字占4個(gè)字符遗座,在存儲(chǔ)數(shù)組中占15字節(jié)舀凛。
第一個(gè)字符是K。
很高興認(rèn)識(shí)你途蒋,我的第一個(gè)字符是J

通過(guò)使用sizeof運(yùn)算符可以計(jì)算出數(shù)組的長(zhǎng)度猛遍,strlen()函數(shù)只計(jì)算存儲(chǔ)在數(shù)組中可見(jiàn)的字符的長(zhǎng)度。

3号坡、字符串輸入

由于不能通過(guò)鍵盤(pán)輸入空字符懊烤,cin使用空白(空格、制表符和換行符)來(lái)確定字符串的結(jié)束位置宽堆,這意味著cin在讀取字符數(shù)組輸入時(shí)如果存在空白則會(huì)導(dǎo)致腌紧,只讀取空白之前的內(nèi)容放到數(shù)組中,并自動(dòng)在結(jié)尾添加空字符畜隶。例如:

// instr1.cpp -- 讀取多個(gè)字符串
#include <iostream>
int main()
{
    using namespace std;
    const int ArSize = 20;
    char name[ArSize];
    char city[ArSize];
    cout << "請(qǐng)輸入你的姓名(姓和名空格分開(kāi)):\n";
    cin >> name;
    cout << "輸入你的城市:\n";
    cin >> city;
    cout << "請(qǐng)確定輸入內(nèi)容:姓名為" << name << "壁肋,所在城市為" << city << endl;
    return 0;
}

運(yùn)行結(jié)果如下:

請(qǐng)輸入你的姓名(姓和名空格分開(kāi)):
張 三
輸入你的城市:
請(qǐng)確定輸入內(nèi)容:姓名為張,所在城市為三

出現(xiàn)以上情況代箭,就是因?yàn)閺埡腿种g有空白墩划。cin在讀取字符數(shù)組輸入時(shí)遇到空白時(shí)涕刚,將讀取的空白之前的內(nèi)容放到數(shù)組中嗡综,并自動(dòng)在結(jié)尾添加空字符,而空白之后的內(nèi)容在遇到下一個(gè)cin時(shí)又會(huì)重復(fù)上面的規(guī)則杜漠,這才導(dǎo)致三字被寫(xiě)入city數(shù)組中极景。

要解決以上問(wèn)題有兩種方法:getline()函數(shù)和get()函數(shù),這兩個(gè)函數(shù)都讀取一行輸入驾茴,直到到達(dá)換行符盼樟。然而,隨后getline()將丟棄換行符锈至,而get()將換行符保留在輸入序列中晨缴。

將上述代碼分別用getline()函數(shù)和get()函數(shù)替換如下:

// instr1.cpp -- 讀取多個(gè)字符串
#include <iostream>
int main()
{
    using namespace std;
    const int ArSize = 20;
    char name[ArSize];
    char city[ArSize];
    cout << "請(qǐng)輸入你的姓名(姓和名空格分開(kāi)):\n";
    cin.get(name,20).get() ;
    cout << "輸入你的城市:\n";
    cin.getline(city,20);
    cout << "請(qǐng)確定輸入內(nèi)容:姓名為" << name << ",所在城市為" << city << endl;
    return 0;
}

運(yùn)行結(jié)果如下:

請(qǐng)輸入你的姓名(姓和名空格分開(kāi)):
張 三
輸入你的城市:
北京
請(qǐng)確定輸入內(nèi)容:姓名為張 三峡捡,所在城市為北京

因?yàn)?code>get()將換行符保留在輸入序列中击碗,需要調(diào)用get()將尾部的換行符讀取掉。否則還是會(huì)出現(xiàn)上面的情況们拙,無(wú)法輸入城市的內(nèi)容稍途。

三、string類(lèi)簡(jiǎn)介

string類(lèi)定義隱藏了字符串的數(shù)組性質(zhì)砚婆,可以像處理普通變量那樣處理字符串械拍。

使用string對(duì)象更方便,也更安全。從理論上說(shuō)坷虑,可以將char數(shù)組視為一組這使得與使用數(shù)組相比甲馋,用于存儲(chǔ)一個(gè)字符串的char存儲(chǔ)單元,而string類(lèi)變量是一個(gè)表示字符串的實(shí)體

1迄损、C++11字符串初始化

C++11也允許將列表初始化用于C風(fēng)格字符串和string對(duì)象摔刁,代碼如下:

char hi[] = { "hi" };
string hello = { "hello" };

2、賦值海蔽、拼接和附加

使用string類(lèi)時(shí)共屈,可以將一個(gè)string對(duì)象賦給另一個(gè)string對(duì)象,代碼如下:

string str1 = "test";
string str2 = str1;

string類(lèi)簡(jiǎn)化了字符串的合并操作党窜∞忠可以使用運(yùn)算符+或者+=將兩個(gè)string對(duì)象合并起來(lái),代碼如下:

string str3 = str1 + str2;
str1 += str2;

3幌衣、string類(lèi)的其他操作

接下來(lái)我們對(duì)比一下string類(lèi)和字符數(shù)組的不同矾削,代碼如下:

// strtype3.cpp -- 更多字符串類(lèi)特性
#include <iostream>
#include <string> // string類(lèi)的頭文件
#include <cstring> // C風(fēng)格字符串頭文件
int main()
{
    using namespace std;
    char charr1[20];
    char charr2[20] = "jaguar";
    string str1;
    string str2 = "panther";
    // string對(duì)象和字符數(shù)組的賦值
    str1 = str2; // 將 str2 復(fù)制給 str1
    strcpy(charr1, charr2); // 將 charr2 復(fù)制給 charr1
    // 用于string對(duì)象和字符數(shù)組的追加
    str1 += " paste"; // 將“ paste”追加到 str1 結(jié)尾
    strcat(charr1, " juice"); // 將“ juice”追加到 charr1 結(jié)尾
    // 查找string對(duì)象和C風(fēng)格字符串的長(zhǎng)度
    int len1 = str1.size(); // 獲取 str1 長(zhǎng)度
    int len2 = strlen(charr1); // 獲取 charr1 長(zhǎng)度
    cout << "字符串 " << str1 << " 包含 "
         << len1 << " 個(gè)字符。\n";
    cout << "字符串 " << charr1 << " 包含 "
         << len2 << " 個(gè)字符豁护。\n";
    return 0;
}

運(yùn)行結(jié)果如下:

字符串 panther paste 包含 13 個(gè)字符哼凯。
字符串 jaguar juice 包含 12 個(gè)字符。

從上述代碼楚里,我們可以看出string對(duì)象的語(yǔ)法通常比使用C字符串函數(shù)簡(jiǎn)單断部,同時(shí)因?yàn)?code>string對(duì)象會(huì)自動(dòng)調(diào)整大小,相對(duì)于字符數(shù)組一不小心就超出目標(biāo)數(shù)組大小班缎,顯得更為安全蝴光。

其中還有一點(diǎn)差別,就是在計(jì)算字符串的長(zhǎng)度時(shí)达址,str1不是被用作函數(shù)的參數(shù)蔑祟,而是通過(guò)句點(diǎn).連接了size()方法。這是因?yàn)?code>str1作為string類(lèi)對(duì)象沉唠,可以使用對(duì)象名和句點(diǎn).運(yùn)算符來(lái)指出方法要使用哪個(gè)字符串疆虚,換一種說(shuō)法就是string類(lèi)對(duì)象通過(guò)句點(diǎn).運(yùn)算符可以調(diào)用string類(lèi)中的方法。

4满葛、string類(lèi) I/O

未初始化的數(shù)組的內(nèi)容是未定義的径簿;其次,函數(shù)strlen()從數(shù)組的第一個(gè)元素開(kāi)始計(jì)算字節(jié)數(shù)纱扭,直到遇到空字符牍帚。

將輸入讀取到string對(duì)象,還可以通過(guò)如下方式:

getline(cin, str1);

5乳蛾、其他形式的字符串字面值

C++有很多類(lèi)型的字符串字面值暗赶,具體如下:

char str[] = "hello";
wchar_t str1[] = L"hello";
char16_t str2[] = u"hello";
char32_t str3[] = U"hello";

C++11新增的另一種類(lèi)型是原始(raw)字符串鄙币。將"()"作為定界符,并使用前綴R來(lái)標(biāo)識(shí)原始字符串:

cout << R"("Apple" 的意思是蘋(píng)果蹂随。)" << endl;

運(yùn)行結(jié)果如下

"Apple" 的意思是蘋(píng)果十嘿。

根據(jù)運(yùn)行結(jié)果我們可以看到,"()"定界符之間的內(nèi)容被原封不動(dòng)的進(jìn)行了輸出岳锁。但當(dāng)我們需要在"()"定界符之間輸入)"時(shí)绩衷,可以在原始字符串語(yǔ)法的"(之間添加其他字符,同時(shí)結(jié)尾")之間也必須包含這些字符激率。例如在"(之間添加+*咳燕,需要使用R"+*()+*",示例代碼如下:

cout << R"+*("(Apple)" 的意思是蘋(píng)果乒躺。)+*" << endl;

運(yùn)行結(jié)果如下

"(Apple)" 的意思是蘋(píng)果招盲。

四、結(jié)構(gòu)簡(jiǎn)介

當(dāng)我們有一組不同類(lèi)型的數(shù)據(jù)需要存儲(chǔ)時(shí)嘉冒,可以使用C++中的結(jié)構(gòu)類(lèi)型曹货。

結(jié)構(gòu)是用戶(hù)定義的類(lèi)型,而結(jié)構(gòu)聲明定義了這種類(lèi)型的數(shù)據(jù)屬性讳推。定義了類(lèi)型后顶籽,便可以創(chuàng)建這種類(lèi)型的變量。因此創(chuàng)建結(jié)構(gòu)包括兩步银觅。首先礼饱,定義結(jié)構(gòu)描述——它描評(píng)并標(biāo)記了能夠存儲(chǔ)在結(jié)構(gòu)中的各種數(shù)據(jù)類(lèi)型。然后按描述創(chuàng)建結(jié)構(gòu)變量(結(jié)構(gòu)數(shù)據(jù)對(duì)象)设拟。最后可以定義結(jié)構(gòu)類(lèi)型后慨仿,通過(guò)成員運(yùn)算符(.)來(lái)訪(fǎng)問(wèn)各個(gè)成員久脯。

結(jié)構(gòu)定義語(yǔ)法:

struct 結(jié)構(gòu)名
{
    //數(shù)據(jù)類(lèi)型
}

1纳胧、在程序中使用結(jié)構(gòu)

// structur.cpp -- 一個(gè)簡(jiǎn)單的結(jié)構(gòu)
#include <iostream>
struct Person // 聲明結(jié)構(gòu)
{
    char name[20];
    int age;
};
int main()
{
    using namespace std;
    Person bjPerson =
    {
            "張三", // name 值
            18 // age 值
    };
    Person shPerson =
    {
            "李四",
            32
    };
    cout << "請(qǐng)北京來(lái)的同學(xué)介紹一下自己:" << "\n";
    cout << "大叫好,我是" << bjPerson.name << "帘撰,今年" << bjPerson.age << "歲\n";
    cout << "接下來(lái)請(qǐng)上海來(lái)的同學(xué)介紹一下自己:" << "\n";
    cout << "大叫好跑慕,我是" << shPerson.name << ",今年" << shPerson.age << "歲\n";
    return 0;
}

運(yùn)行結(jié)果如下:

請(qǐng)北京來(lái)的同學(xué)介紹一下自己:
大叫好摧找,我是張三核行,今年18歲
接下來(lái)請(qǐng)上海來(lái)的同學(xué)介紹一下自己:
大叫好,我是李四蹬耘,今年32歲

在使用結(jié)構(gòu)之前芝雪,首先聲明結(jié)構(gòu),然后如聲明數(shù)組變量一樣综苔,使用結(jié)構(gòu)類(lèi)型名加上變量名即可表明一個(gè)結(jié)構(gòu)類(lèi)型惩系,接著和數(shù)組一樣位岔,使用由逗號(hào)分隔值列表,并將這些值用花括號(hào)括起堡牡。

要調(diào)用結(jié)構(gòu)類(lèi)型中的成員抒抬,使用成員運(yùn)算符(.)即可。

2晤柄、C++11結(jié)構(gòu)初始化

與數(shù)組一樣擦剑,C++11也支持將列表初始化用于結(jié)構(gòu),且等號(hào)(=)是可選的:

Person bjPerson{"張三", 18};

當(dāng)大括號(hào)內(nèi)未包含任何東西芥颈,各個(gè)成員都將被設(shè)置為零惠勒。

Person bjPerson{};

bjPerson.name的每個(gè)字節(jié)都被設(shè)置為零,bjPerson.age被設(shè)置為零爬坑。

同數(shù)組一樣捉撮,不允許縮窄轉(zhuǎn)換。

3妇垢、結(jié)構(gòu)可以將string類(lèi)作為成員嗎

只要編譯器支持對(duì)以string對(duì)象作為成員的結(jié)構(gòu)進(jìn)行初始化:

#include <string>
struct Person // 聲明結(jié)構(gòu)
{
    std::string name;
    int age;
};

4巾遭、其他結(jié)構(gòu)屬性

C++使用戶(hù)定義的類(lèi)到與內(nèi)置類(lèi)型盡可能相似。例如闯估,可以將結(jié)構(gòu)作為參數(shù)傳遞給函數(shù)灼舍,也可以讓函數(shù)返回一個(gè)結(jié)構(gòu)。另外涨薪,還可以使用賦值運(yùn)算行(=)將結(jié)構(gòu)賦給另一個(gè)同類(lèi)型的結(jié)構(gòu)骑素,這樣結(jié)構(gòu)中每個(gè)成員都將被設(shè)置為另一個(gè)結(jié)構(gòu)中相應(yīng)成員的值,即使成員是數(shù)組刚夺。這種賦值被稱(chēng)為成員賦值(assignment))献丑。

5、結(jié)構(gòu)數(shù)組

結(jié)構(gòu)是用戶(hù)定義的類(lèi)型侠姑,也可以如其他基本類(lèi)型一樣创橄,創(chuàng)建對(duì)應(yīng)的數(shù)組,代碼如下:

Person persons[2] = 
{
    {
            "張三", 
            18 
    },
    {
            "李四",
            32
    }
};
    cout << "請(qǐng)第一位同學(xué)介紹一下自己:" << "\n";
    cout << "大叫好莽红,我是" << persons[0].name << "妥畏,今年" << persons[0].age << "歲\n";

6、結(jié)構(gòu)中的位字段

字段的類(lèi)型應(yīng)為整型或枚舉安吁,接下來(lái)是冒號(hào)醉蚁,冒號(hào)后面是指定了使用位數(shù)的數(shù)字」淼辏可以使用沒(méi)有名稱(chēng)的字段提供間距网棍。每個(gè)成員都被稱(chēng)為位字段(bit field)。示例代碼:

struct ComputerInfo
{
    unsigned int SN : 4;//序列號(hào)占4bit
    unsigned int : 4;//空白間距占4bit
    unsigned int Version : 1;//版本號(hào)占1bit
}

可以像通常那樣初始化這些字段:

ComputerInfo computerInfo = {14, 3 };

五妇智、 共用體

共用體 (union)是一種數(shù)據(jù)格式滥玷,它能夠存儲(chǔ)不同的數(shù)據(jù)類(lèi)型捌锭,但只能同時(shí)存儲(chǔ)其中的一種類(lèi)型。也就是說(shuō)罗捎,結(jié)構(gòu)可以同時(shí)存儲(chǔ) int观谦、longdouble,共用體只能存儲(chǔ)int桨菜、longdouble豁状。共用體的句法與結(jié)構(gòu)相似,但含義不同倒得。例如泻红,請(qǐng)看下面的聲明:

#include <iostream>
using namespace std;
struct Person // 聲明結(jié)構(gòu)
{
    union
    {
        unsigned short insideId;
        long globalId;
    } PersonId;
    string name;
    int age;
};
int main()
{
    Person person;
    person.PersonId.insideId = 101;
    person.name = "張三";
    person.age = 18;
    cout << "人員內(nèi)部Id是" << person.PersonId.insideId << endl;
    person.PersonId.globalId = 122834;
    cout << "人員全局Id是" << person.PersonId.globalId << endl;
}

共用體常用于操作系統(tǒng)數(shù)據(jù)結(jié)構(gòu)或硬件數(shù)據(jù)結(jié)構(gòu)。

六霞掺、枚舉

C++的enum工具提供了另一種創(chuàng)建符號(hào)常量的方式谊路,這種方式可以代替const。它還允許定義新類(lèi)型菩彬,但必須按嚴(yán)格的限制進(jìn)行缠劝。使用enum的句法與使用結(jié)構(gòu)相似。示例代碼如下:

enum myColor
{
    red,
    blue,
    green
};

以上代碼讓myColor成為新類(lèi)型的名稱(chēng)骗灶; myColor被稱(chēng)為枚舉(enumeration)惨恭。就像struct變量被稱(chēng)為結(jié)構(gòu)一樣。將red耙旦、blue脱羡、green作為符號(hào)常量,它們對(duì)應(yīng)整數(shù)值0~2免都。這些常量叫作枚舉量(enumerator)锉罐。

在默認(rèn)情況下,將整數(shù)值賦給枚舉量绕娘,第一個(gè)枚舉量的值為0脓规,第二個(gè)枚舉量的值為1,依次類(lèi)推业舍。

枚舉通常被用來(lái)定義相關(guān)的符號(hào)變量抖拦,而不是新類(lèi)型。

演示代碼:

enum myColor
{
    red,
    blue,
    green
};
int main()
{
    myColor color1;
    color1 = red;
    color1 = myColor(1);
}

在使用整型轉(zhuǎn)換為枚舉時(shí)舷暮,需要使用枚舉括號(hào)包含整型值進(jìn)行轉(zhuǎn)換才行。

1噩茄、設(shè)置枚舉量的值

可以使用賦值運(yùn)算符來(lái)顯式地設(shè)置枚舉量的值:

enum myColor
{
    red = 2,
    blue = 4,
    green = 7
};

指定的值必須是整數(shù)下面。也可以只顯式地定義其中一些校舉量的值,甚至可以將多個(gè)枚舉值設(shè)置為同一整數(shù)绩聘。

2沥割、枚舉的取值范圍

取值范圍的定義如下:

  • 找出上限耗啦,需要知道枚舉量的最大值。找到大于這個(gè)最大值的机杜、最小值的2的冪帜讲,將它減去1,得到的便是取值范圍的上限椒拗。
  • 計(jì)算下限似将,需要知道枚舉量的最小值。如果它不小于0蚀苛,則取值范圍的下限為0在验;否則,采用與尋找上限方式相同的方式堵未,但加上負(fù)號(hào)腋舌。

選擇用多少空間來(lái)存儲(chǔ)枚舉由編評(píng)器決定。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渗蟹,一起剝皮案震驚了整個(gè)濱河市块饺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雌芽,老刑警劉巖刨沦,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膘怕,居然都是意外死亡想诅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)岛心,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)来破,“玉大人,你說(shuō)我怎么就攤上這事忘古∨墙” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵髓堪,是天一觀的道長(zhǎng)送朱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)干旁,這世上最難降的妖魔是什么驶沼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮争群,結(jié)果婚禮上回怜,老公的妹妹穿的比我還像新娘。我一直安慰自己换薄,他們只是感情好玉雾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布翔试。 她就那樣靜靜地躺著,像睡著了一般复旬。 火紅的嫁衣襯著肌膚如雪垦缅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天驹碍,我揣著相機(jī)與錄音壁涎,去河邊找鬼。 笑死幸冻,一個(gè)胖子當(dāng)著我的面吹牛粹庞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洽损,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼庞溜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了碑定?” 一聲冷哼從身側(cè)響起流码,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎延刘,沒(méi)想到半個(gè)月后漫试,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碘赖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年驾荣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片普泡。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡播掷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撼班,到底是詐尸還是另有隱情歧匈,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布砰嘁,位于F島的核電站件炉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏矮湘。R本人自食惡果不足惜斟冕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望板祝。 院中可真熱鬧宫静,春花似錦、人聲如沸券时。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)橘洞。三九已至捌袜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炸枣,已是汗流浹背虏等。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留适肠,地道東北人霍衫。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像侯养,于是被迫代替她去往敵國(guó)和親敦跌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 本章內(nèi)容概覽: 數(shù)組 C風(fēng)格字符串 string類(lèi)字符串 getline()和get()讀取字符串 結(jié)構(gòu)體 共用體...
    Dragon_boy閱讀 308評(píng)論 0 0
  • 1.關(guān)于讀取字符串 在讀取輸入時(shí)逛揩,如果使用cin函數(shù)柠傍,僅能每次讀取一個(gè)單詞,因?yàn)樵摵瘮?shù)默認(rèn)遇到空白(空格辩稽、換行惧笛、制...
    Leon_Geo閱讀 239評(píng)論 0 0
  • 內(nèi)容思維導(dǎo)圖 內(nèi)容要點(diǎn) 1. 數(shù)組 數(shù)組(array)是一種數(shù)據(jù)格式,能夠存儲(chǔ)多個(gè)同類(lèi)型的值逞泄。 數(shù)組聲明應(yīng)指出以下...
    蓬篙人閱讀 315評(píng)論 0 1
  • 基于基本類(lèi)型和浮點(diǎn)類(lèi)型創(chuàng)建(C語(yǔ)言:派生類(lèi)型) 1.數(shù)組(簡(jiǎn)介) 1.數(shù)組聲明 ·存儲(chǔ)在每個(gè)元素中的值的類(lèi)型 ·數(shù)...
    MelloCat閱讀 675評(píng)論 0 3
  • char[] 數(shù)組申明必須是整形常值或const值患整,以及常量表達(dá)式如(8*sizeof(int)),即所有的值在編...
    鏡中無(wú)我閱讀 172評(píng)論 0 0