21.22:通常的做法是將相關(guān)變量定義為PRivate,而接口函數(shù)定義為public。具體情況具體討論
23:知識(shí)點(diǎn)1:類可以自定義某種類型在類中的別名—通過typedef和using
知識(shí)點(diǎn)2:如果我們需要合成的默認(rèn)構(gòu)造函數(shù),在空列表的構(gòu)造函數(shù)后加上=default即可
知識(shí)點(diǎn)3:類的成員也可以重載,參數(shù)列表數(shù)量或者類型上不同
知識(shí)點(diǎn)4:在變量前加關(guān)鍵字mutable,變?yōu)榭勺償?shù)據(jù)成員,即使是在一個(gè)const的對象函數(shù)中也可以被修改
知識(shí)點(diǎn)5:類內(nèi)初始值,直接用=賦予的方式是C++11新特性,也就是VS2013以上的版本才支持
知識(shí)點(diǎn)6:當(dāng)某個(gè)數(shù)據(jù)成員在構(gòu)造函數(shù)初始化列表中忽略,它將以默認(rèn)構(gòu)造函數(shù)的方式隱式初始化
#ifndef Cccc//第一次包含本頭文件時(shí),#ifndef判斷為真,預(yù)處理器將處理后面的內(nèi)容直到#endif,此時(shí)的預(yù)處理變量Cccc已定義#define Cccc//第二次包含本頭文件時(shí),#ifndef判斷為假,預(yù)處理器將忽略后面的內(nèi)容#include <string>class Screen {public: using pos = std::string::size_type;//std庫中的string類的sizetype類型 Screen() = default; Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c) { } char get() const { return contents[cursor]; } char get(pos r, pos c) const { return contents[r * width + c]; }private: pos cursor = 0; pos height = 0, width = 0; std::string contents;};#endif//只要簡單的加上就好了,無視C++中的作用域規(guī)則,作用是防止頭文件被重復(fù)包含/*c++ string::size_type詳解 string::size_type類型 從邏輯上來講,size()成員函數(shù)似乎應(yīng)該返回整型數(shù)值,或如2.2節(jié)“建議”中所述的無符號(hào)整數(shù)。但事實(shí)上,size操作返回的是string::size_type類型的值。 我們需要對這種類型做一些解釋。string類類型和許多其他庫類型都定義了一些伙伴類型(companion types)。這些伙伴類型使得庫類型的使用是機(jī)器無關(guān)的(machine-independent)。 size_type就是這些伙伴類型中的一種。它定義為與unsigned型(unsigned int或unsigned long)具有相同的含義,而且可以保證足夠大可存儲(chǔ)任意string對象的長度。 為了使用由string類型定義的size_type類型,程序員必須加上作用域操作符來說明所使用的size_type類型是由string類定義的。 任何存儲(chǔ)string的size操作結(jié)果的變量必須為string::size_type類型。特別重要的是,不要把size的返回值賦給一個(gè)int變量。 雖然我們不知道string::size_type的確切類型,但可以知道它是unsigned型(2.1.1節(jié))。對于任意一種給定的數(shù)據(jù)類型,它的unsigned型所能表示的最大正數(shù)值比對應(yīng)的signed要大一倍。 這個(gè)事實(shí)表明size_type存儲(chǔ)的string長度是int所能存儲(chǔ)的兩倍。 使用int變量的另一個(gè)問題是,有些機(jī)器上int變量的表示范圍太小,甚至無法存儲(chǔ)實(shí)際并不長的string對象。如在有16位int型的機(jī)器上,int類型變量最大只能表示32767個(gè)字符的string對象。 而能容納一個(gè)文件內(nèi)容的string對象輕易就會(huì)超過這個(gè)數(shù)字。因此,為了避免溢出,保存一個(gè)string對象size的最安全的方法就是使用標(biāo)準(zhǔn)庫類型string:: size_type。 string類類型和許多其他庫類型都定義了一些配套類型(companion type)。通過這些配套類型,庫類型的使用就能和機(jī)器無關(guān)(machine-independent)。string::size_type定義為unsigned型,可以保證足夠大的存儲(chǔ)string對象的長度。 注意,任何存儲(chǔ)string的size操作結(jié)果的變量必須為string::size_type類型。尤其不能把size的返回值賦給一個(gè)int變量。(因?yàn)閟ize返回的是一個(gè)unsigned類型,而int是signed類型。size能表達(dá)的大小是int的2倍)。 string str("some string"); //通過字符串字面值賦值給串 for (string::size_type ix = 0; ix != str.size(); ++ix) //此處不該為int 用!=,而不用<= { cout<<str[ix]<<endl; } vector<int> ivec; for(vector<int>::iterator ix = ivec.begin(); ix != ivec.end(); ++ix) //此處不該為int 用!=,而不用<= { *ix = 0; //將各個(gè)元素賦值為0 } 綜上所述:string::size_type 等價(jià)于 unsigned ,使用情況為存儲(chǔ)字符串的大小*/24:
Screen() = default; // 1Screen(pos ht, pos wd) : height(ht), width(wd), contents(ht * wd, ' ') {} // 2Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c){} // 3其他同上25:只有內(nèi)置類型和string類型可以依賴于操作的默認(rèn)版本
26:在類體外定義直接加inline即可,體內(nèi)聲明為inline也可,但要保持一致。
27:知識(shí)點(diǎn):返回引用的函數(shù)為左值,返回*this的函數(shù),返回本函數(shù)修改后的對象本身而非對象的副本。這樣的話就會(huì)出現(xiàn)函數(shù)的重復(fù)使用,如下:
myScreen.move(4, 0).set('#').display(std::cout);//move()和display()函數(shù)可以相互調(diào)用,因?yàn)樗麄兊姆祷刂凳菍ο蟮谋旧恚搶ο缶褪莔yScreen,move()和dispaly()函數(shù)對myScerrn執(zhí)行不同的操作28:知識(shí)點(diǎn):若函數(shù)返回類型變?yōu)镾creen,則返回的是對象的副本,函數(shù)的操作只能添加于對象的副本上,對象的本身并沒有改變。
此題中,myScreen本身并不會(huì)被三個(gè)函數(shù)所改變,所以不會(huì)輸出“#”
29:正確
30:優(yōu)點(diǎn):
1:當(dāng)需要將一個(gè)對象作為整體引用而不是引用對象的一個(gè)成員時(shí),使用this,則該函數(shù)返回對調(diào)用該函數(shù)的對象的引用。
2:可以非常明確地指出訪問的是調(diào)用該函數(shù)的對象的成員,且可以在成員函數(shù)中使用與數(shù)據(jù)成員同名的形參。
缺點(diǎn):不必要使用,代碼多余。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注