前言
個(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)型乌叶,以及將介紹new
和delete
及如何使用它們來(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
观谦、long
和double
,共用體只能存儲(chǔ)int
桨菜、long
或double
豁状。共用體的句法與結(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)器決定。