第四章 復(fù)合類型

一攒岛、數(shù)組

C++數(shù)組從0開始編號(hào)舆绎。

數(shù)組不可以相互賦值。

在C++11中 初始化數(shù)組可以忽略等號(hào)秸歧,其次如果再大括號(hào)中不填入任何東西厨姚,這將吧所有元素設(shè)為0,同時(shí)列表初始化禁止縮窄轉(zhuǎn)換键菱。

二谬墙、字符串

字符串賦值...

拼接字符串常量

拼接字符串時(shí)前一個(gè)字符串的\0被下一個(gè)字符串第一個(gè)字符替代。

strlen()只計(jì)算可見的字符,而不把空字符計(jì)算在內(nèi)拭抬。

cin使用空白(空格部默、制表符和換行符)來確定字符串的結(jié)束位置,這意味著cin在獲取字符數(shù)組輸入時(shí)之讀取一個(gè)單詞造虎。讀取該單詞后傅蹂,cin將該字符串放到數(shù)組中,并自動(dòng)在結(jié)尾添加空字符累奈。

每次讀取一行字符串輸入

面向行的輸入:getline()

getline()函數(shù)讀取整行贬派,它通過回車鍵輸入的換行符來確定輸入結(jié)尾。要調(diào)用這種方法澎媒,可以使用cin.getline()搞乏。該函數(shù)有兩個(gè)參數(shù)。第一個(gè)參數(shù)是用來儲(chǔ)存輸入行的數(shù)組的名稱戒努,第二個(gè)參數(shù)是讀取字符數(shù)(包括了\0)请敦。getline()成員函數(shù)在讀取指定數(shù)目的字符或遇到換行符時(shí)停止讀取并舍棄換行符。如果第一個(gè)字符是換行符储玫,將會(huì)將一個(gè)空字符串賦給數(shù)組侍筛。

面向行的輸入:get()

cin.get()用于讀取下一個(gè)輸入的字符。

cin.get(name,size)遇到換行符不再讀取并將其留在輸入序列中撒穷。

另一種方法是醬兩個(gè)類成員函數(shù)拼接起來 cin.get(name,size).get()

之所以可以這樣做匣椰,是由于cin.get(name,size)返回一個(gè)cin對(duì)象,該對(duì)象隨后將被用來調(diào)用get()函數(shù)端礼。

同樣 cin.getline(name,size).getline(name,size);禽笑。也可。

當(dāng)讀取空行時(shí) get()讀取空行后將設(shè)置失效位置蛤奥。這意味著加些來的輸入將被阻斷佳镜。可以用cin.clear()來恢復(fù)輸入凡桥。

如果輸入行包括的字符數(shù)比指定的多則getline()和get()將把余下的字符留在輸入隊(duì)列中蟀伸,而getline()還會(huì)設(shè)置失效位,并關(guān)閉后面的輸入缅刽。

混合輸入字符串和數(shù)字

string類簡(jiǎn)介

頭文件string #include<string>

string str1,str2;

可以使用c風(fēng)格字符串來初始換string對(duì)象啊掏。可以使用cin來將鍵盤輸入儲(chǔ)存到string對(duì)象中衰猛。

可以使用cout來顯示string對(duì)象脖律。可以使用數(shù)組表書法方位儲(chǔ)存在string對(duì)象中的字符腕侄。

str1=str2; //把2復(fù)制給1小泉。 str1+=“xxx”//在str1后增添xxx芦疏。

string類具有自動(dòng)調(diào)整大小的功能。

確定字符串字符數(shù) int len1=str1.size(); //int len2=strlen(str2);

c函數(shù)使用參數(shù)來指出要使用哪個(gè)字符串微姊,而C++ string類對(duì)象使用對(duì)象名和據(jù)點(diǎn)運(yùn)算符來指出要使用哪個(gè)字符串酸茴。

使用getline讀取string類 getline(cin,str);

C++結(jié)構(gòu) C++允許在聲明結(jié)構(gòu)變量時(shí)省略關(guān)鍵字struct

與數(shù)組一樣,C++11也至此將列表初始化用于結(jié)構(gòu)兢交,且等號(hào)是可選的薪捍。

一定要讓結(jié)構(gòu)定義能夠訪問名稱空間std。

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

共用體

共用體是一種數(shù)據(jù)格式配喳,它能夠儲(chǔ)存不同的數(shù)據(jù)類型酪穿,但只能同時(shí)儲(chǔ)存其中一種類型,共用體長(zhǎng)度為最大成員長(zhǎng)度晴裹。

匿名共用體沒有名稱被济,其成員將成為位于相同地址處的變量,顯然涧团,每次只有一個(gè)成員是當(dāng)前的成員只磷。共用體常用于節(jié)省內(nèi)存。

枚舉...

指針和自由儲(chǔ)存空間

指針定義方面略 詳見后文泌绣。

指針的危險(xiǎn)

在C++中創(chuàng)建指針時(shí)钮追,計(jì)算機(jī)將分配用來儲(chǔ)存地址的內(nèi)存,但不會(huì)分配用來儲(chǔ)存指針?biāo)赶虻膬?nèi)存阿迈。

一定要在對(duì)指針應(yīng)用解除引用運(yùn)算符*之前元媚,講指針初始化為一個(gè)確定的適當(dāng)?shù)牡刂贰?/p>

用new來分配內(nèi)存。

在C語言苗沧,可以用庫(kù)函數(shù)malloc()來分配內(nèi)存刊棕;在C++中仍然可以這樣做,但C++還有更好的方法———new運(yùn)算符崎页。

程序員要告訴new需要為哪種數(shù)據(jù)類型分配內(nèi)存鞠绰;new將找到一個(gè)長(zhǎng)度正確的內(nèi)存塊腰埂,并返回該內(nèi)存塊的地址飒焦。程序員的責(zé)任是將該地址賦給一個(gè)指針。 例如 int * pn=new int;(相比malloc方便很多)

對(duì)于指針屿笼,需要指出的另一點(diǎn)是牺荠,new分配的內(nèi)存塊通常與常規(guī)變量聲明分配的內(nèi)存塊不同。變量nights和pd的值都儲(chǔ)存在中被稱為棧的內(nèi)存區(qū)域中驴一,而new從被稱為堆的自由儲(chǔ)存區(qū)的內(nèi)存區(qū)域分配內(nèi)存休雌。

內(nèi)存被耗盡new將會(huì)返回空指針。

使用delete釋放內(nèi)存

例如delete p;(類比C語言中的free)

delete會(huì)釋放指針?biāo)赶虻膬?nèi)存肝断,但不會(huì)刪除指針本身杈曲,也就是說指針可以重新指向另一個(gè)內(nèi)存塊驰凛。

注意:只能用delete來釋放使用new分配的內(nèi)存。然而担扑,對(duì)空指針使用delete是安全的恰响。

使用new來創(chuàng)建動(dòng)態(tài)數(shù)組。

int * psome= new int [10];

delete [] psome;

方括號(hào)告訴程序應(yīng)該釋放整個(gè)數(shù)組涌献,而不僅僅是指針指向的元素胚宦。

總之 1.不要使用delete釋放不是new分配的內(nèi)存。

? ? ? ? 2.不要使用delete釋放同一個(gè)內(nèi)存塊兩次燕垃。

? ? ? ? 3.如果使用 new []為數(shù)組分配內(nèi)存枢劝,則應(yīng)使用delete[]來釋放。

? ? ? ? 4.如果使用new為一個(gè)實(shí)體分配內(nèi)存卜壕,則應(yīng)使用delete來釋放您旁。

? ? ? ? 5.對(duì)空指針應(yīng)用delete是安全的。

使用動(dòng)態(tài)數(shù)組印叁”幻埃可以直接使用psome[0]...psome=psome+1可以指向數(shù)組中下一個(gè)元素的地址。在使用delete釋放動(dòng)態(tài)數(shù)組時(shí)指針應(yīng)該指向原來的值轮蜕,這樣可以給delete[]提供正確的地址昨悼。所以說 p[i]=*(p+i);注意的是數(shù)組名是不允許進(jìn)行加一處理的。

指針跃洛、數(shù)組和指針?biāo)阈g(shù)率触。

同C一樣C++將數(shù)組名解釋為地址。指針加一會(huì)增加它所指向類型的字節(jié)數(shù)汇竭。

在多數(shù)情況下C++將數(shù)組名解釋為數(shù)組第一個(gè)元素的地址葱蝗。所以可以在指針初始化時(shí)讓他等于數(shù)組名。

數(shù)組和指針第一個(gè)區(qū)別是可以修改指針的值细燎,而數(shù)組名是常量两曼。另一個(gè)區(qū)別是對(duì)數(shù)組應(yīng)用sizeof運(yùn)算符得到的是數(shù)組的長(zhǎng)度,而對(duì)指針應(yīng)用sizeof得到的是指針的長(zhǎng)度玻驻。

對(duì)數(shù)組取地址(暫略 個(gè)人認(rèn)為應(yīng)該在二維數(shù)組等方面會(huì)詳細(xì)涉及 詳細(xì)將放在文尾)

使用數(shù)組聲明來創(chuàng)建數(shù)組時(shí)悼凑,將采用靜態(tài)聯(lián)編,即數(shù)組的長(zhǎng)度在編譯時(shí)設(shè)置璧瞬。

使用new[]運(yùn)算符創(chuàng)建數(shù)組時(shí)户辫,將采用動(dòng)態(tài)聯(lián)編(動(dòng)態(tài)數(shù)組)(ps.這里是可以做變長(zhǎng)數(shù)組的),即將在運(yùn)行時(shí)位數(shù)組分配空間嗤锉,其長(zhǎng)度也將在運(yùn)行時(shí)設(shè)置渔欢。使用完這種數(shù)組后,應(yīng)使用delete[]釋放其占用的內(nèi)存瘟忱。

數(shù)組和指針的特殊關(guān)系可以款占到C-風(fēng)格字符串奥额。

在C++中苫幢,用引號(hào)括起的字符串像數(shù)組名一樣,也是第一個(gè)元素的地址垫挨。代碼不會(huì)將整個(gè)字符串發(fā)送給cout态坦,傳遞的是他們的地址。

在cout和多數(shù)C++表達(dá)式中棒拂,char數(shù)組名伞梯、char指針一級(jí)用引號(hào)括起的字符串常量都被解釋為字符串的第一個(gè)字符的地址。

在將字符串讀入程序是應(yīng)使用已分配的內(nèi)存地址帚屉。該地址可以使數(shù)組名谜诫,也可以是使用new初始化過的指針。

在用cout輸出字符串時(shí)如果前面加上(int *)則會(huì)輸出他的地址攻旦。

使用new創(chuàng)建動(dòng)態(tài)結(jié)構(gòu)

struct things{

int good;

int bad;

};

things grubnose={10,20};//grubnose是一個(gè)結(jié)構(gòu) 他含有兩個(gè)變量并進(jìn)行了初始化喻旷。

things *p=&grubnose; pt指向結(jié)構(gòu)grubnose。

引用方面 p->good等價(jià)于grubnose.good也等價(jià)于(*p).good牢屋。

自動(dòng)儲(chǔ)存且预、靜態(tài)儲(chǔ)存和動(dòng)態(tài)儲(chǔ)存。(C++新增了第四種類型———線程儲(chǔ)存)

1.自動(dòng)存儲(chǔ)烙无。

在函數(shù)內(nèi)部定義的常規(guī)變量使用自動(dòng)儲(chǔ)存空間锋谐,被稱為自動(dòng)變量,這以為著他們?cè)谒鶎俸瘮?shù)被調(diào)用時(shí)自動(dòng)產(chǎn)生截酷,在函數(shù)結(jié)束時(shí)消失涮拗。

實(shí)際上,自動(dòng)變量是一個(gè)局部變量迂苛,其作用域?yàn)榘拇a塊三热。自動(dòng)變量通常儲(chǔ)存在棧中。這意味著執(zhí)行代碼塊是三幻,其中的變量將依次加入到棧中就漾,而離開代碼塊時(shí)將按相反的順序釋放這些變量,這被稱為先進(jìn)后出念搬。因此抑堡,在程序執(zhí)行過程中,棧將不斷地增大和縮小锁蠕。

2.靜態(tài)存儲(chǔ)夷野。

靜態(tài)存儲(chǔ)是整個(gè)程序執(zhí)行期間都存在的儲(chǔ)存方式懊蒸。使變量成為靜態(tài)的方式有兩種:一種是在函數(shù)外面定義它荣倾;另一種是在聲明變量時(shí)使用關(guān)鍵字static。

3.動(dòng)態(tài)存儲(chǔ)骑丸。

new和delete運(yùn)算符提供了一種比自動(dòng)變量和靜態(tài)變量更靈活的方法舌仍。他們管理了一個(gè)內(nèi)存池妒貌,這在C++中被稱為自動(dòng)存儲(chǔ)空間或堆。該內(nèi)存池同用于靜態(tài)變量和自動(dòng)變量的內(nèi)存是分開的铸豁。new和delete可以在一個(gè)函數(shù)中分配內(nèi)存灌曙,而在另一個(gè)函數(shù)中釋放它。

內(nèi)存泄漏...

類型組合...

數(shù)組的替代品

1.模板類vector

模板類vector類似于string類节芥,也是一種動(dòng)態(tài)數(shù)組在刺。您可以在運(yùn)行階段設(shè)置vector對(duì)象的長(zhǎng)度,可在末尾附加新數(shù)據(jù)头镊,還可在中間插入新數(shù)據(jù)蚣驼。基本上相艇,他是使用new創(chuàng)建動(dòng)態(tài)數(shù)組的替代品颖杏。實(shí)際上,vector確實(shí)使用new和delete來管理內(nèi)存坛芽,但這種工作是自動(dòng)完成的留储。

頭文件要包含#include<vector>

vector<typename> vt(n_elem); //typename是類型 vt為數(shù)組名 n_elem為長(zhǎng)度 可以不帶(n_elem)默認(rèn)為0。其中n_elem可以是整型常量也可以是整型變量咙轩。

2.模板類array

array長(zhǎng)度固定获讳,也使用棧。

array<typename,n_elem> arr活喊。

不同的是 n_elem不能是變量赔嚎。

在C++11中,可將列表初始化用于vector和array對(duì)象胧弛,但在C++98中尤误,不能對(duì)vector對(duì)象這樣做。

注意 double a1[3];

a1[-2]等價(jià)于*(a1-2)出現(xiàn)越界

vector和array同樣结缚。

一種解決方法是使用成員函數(shù)at()损晤。 例如a2.at(1)=2.3。使用at()時(shí)將在運(yùn)行期間捕獲非法索引红竭,而程序默認(rèn)將中斷尤勋。

(完)

很明顯這章相比于前三章長(zhǎng)了很多(正好3k字) 但是 相對(duì)來看 如果有一定編程基礎(chǔ)的話本章其實(shí)應(yīng)該較容易去理解 。


附上菜鳥教程茵宪。
http://www.runoob.com/cplusplus/cpp-variable-scope.html

http://www.runoob.com/cplusplus/cpp-pointers.html

http://www.runoob.com/cplusplus/cpp-arrays.html

http://www.runoob.com/cplusplus/cpp-array-of-pointers.html

http://www.runoob.com/cplusplus/cpp-pointers-vs-arrays.html

http://www.runoob.com/cplusplus/cpp-pointer-to-pointer.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末最冰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子稀火,更是在濱河造成了極大的恐慌暖哨,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凰狞,死亡現(xiàn)場(chǎng)離奇詭異篇裁,居然都是意外死亡沛慢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門达布,熙熙樓的掌柜王于貴愁眉苦臉地迎上來团甲,“玉大人,你說我怎么就攤上這事黍聂√煽啵” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵产还,是天一觀的道長(zhǎng)圾另。 經(jīng)常有香客問我,道長(zhǎng)雕沉,這世上最難降的妖魔是什么集乔? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮坡椒,結(jié)果婚禮上扰路,老公的妹妹穿的比我還像新娘。我一直安慰自己倔叼,他們只是感情好汗唱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丈攒,像睡著了一般哩罪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巡验,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天际插,我揣著相機(jī)與錄音,去河邊找鬼显设。 笑死框弛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捕捂。 我是一名探鬼主播瑟枫,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼指攒!你這毒婦竟也來了慷妙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤允悦,失蹤者是張志新(化名)和其女友劉穎膝擂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猿挚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驶鹉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绩蜻。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖室埋,靈堂內(nèi)的尸體忽然破棺而出办绝,到底是詐尸還是另有隱情,我是刑警寧澤姚淆,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布孕蝉,位于F島的核電站,受9級(jí)特大地震影響腌逢,放射性物質(zhì)發(fā)生泄漏降淮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一搏讶、第九天 我趴在偏房一處隱蔽的房頂上張望佳鳖。 院中可真熱鬧,春花似錦媒惕、人聲如沸系吩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)穿挨。三九已至,卻和暖如春肴盏,著一層夾襖步出監(jiān)牢的瞬間科盛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工菜皂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留土涝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓幌墓,卻偏偏與公主長(zhǎng)得像但壮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子常侣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 基于基本類型和浮點(diǎn)類型創(chuàng)建(C語言:派生類型) 1.數(shù)組(簡(jiǎn)介) 1.數(shù)組聲明 ·存儲(chǔ)在每個(gè)元素中的值的類型 ·數(shù)...
    MelloCat閱讀 680評(píng)論 0 3
  • 2018年8月17日 22:14:16 title: C++PrimerPlus讀書筆記typora-root-u...
    _layty閱讀 217評(píng)論 0 0
  • Tags:C++蜡饵,《C++ Primer Plus》筆記 一、分類## 如下圖胳施,大概分為這些類型溯祸,每種類型的聲明語...
    傻沙閱讀 1,047評(píng)論 0 0
  • 1.利用cin、cin.get()和cin.getline()輸入字符串的區(qū)別iostream中的類cin提供了一...
    安公子_閱讀 258評(píng)論 0 0
  • 有句話我們常說,不說話沒人把你當(dāng)啞巴焦辅,很不幸的是假如你不肯站出來博杖,說有趣是存在的,別人就會(huì)以為你和他一樣是...
    島孤閱讀 1,096評(píng)論 0 0