2018-08-06 effective C++ 筆記1

附錄

std 命名空間是所有C++ 標(biāo)準(zhǔn)庫的棲身處

然而C 標(biāo)準(zhǔn)程序庫耶適用于C++ 內(nèi)。


signature 簽名:

函數(shù)的聲明揭示簽名式。 也就是參數(shù)和返回類型。


看到賦值語句也要小心, 因?yàn)?語法也可以用來調(diào)用copy 構(gòu)造函數(shù):

Widget w3 = w2 //調(diào)用copy 構(gòu)造函數(shù)


幸運(yùn)的是copy構(gòu)造和 賦值 很容易區(qū)別。 如果一個新對象被定義菊碟, 一定會有個 構(gòu)造函數(shù)被調(diào)用。



STL: 標(biāo)準(zhǔn)模板庫在刺, 是C++標(biāo)準(zhǔn)程序庫的一部分逆害。

接口:一般討論的是函數(shù)的簽名或者class 的可訪問元素



條款1 :

STL 中的迭代器和函數(shù)都是在C指針上塑造出來的, 所以對STL 的迭代器和函數(shù)對象而言蚣驼, 舊式的C pass by value 守則很適用


條款2:盡量用enum const inline 替換 define

1.因?yàn)楸籨efine 的標(biāo)記 也許從未被編譯器看見魄幕, 所以沒進(jìn)入記號表,當(dāng)你運(yùn)用此變量但獲得一個編譯錯誤信息時颖杏, 可能回帶來困惑纯陨。

常量定義式通常被放在頭文件, 以便被不同的源碼include.


2.對于class 的專屬常量

class GamePlayer

{

? ? public:

static const int NumTurns = 5; // 常量表明式

}


只要不取NumTurns的地址留储, 就可以不在實(shí)現(xiàn)文件那里提供定義式翼抠。

const int GamePlayer::NumTurns;? // 不給予數(shù)值也可以, 因?yàn)樵诼暶魈幰呀?jīng)賦了初值


唯一例外時當(dāng)你在class 編譯階段需要一個class常量值時获讳, 萬一你的編譯器不接受static整數(shù)型 class 常量完成 in class 初值設(shè)定阴颖, 就可以用the enum hack 補(bǔ)償做法

class GamePlayer:

{

private:

? ? ? ? enum{ NumTurns = 5 };

? ? ? ? int scores[NumTurns];

}

因?yàn)镋nums 和 define一樣不導(dǎo)致非必要的內(nèi)存分配。


另外一種情況時#define的誤用情況

#define? CALL_WITH_MAX(a,b)? f((a)> (b) > (a) : (b))

當(dāng)調(diào)用時

CALL_WITH_MAX( ++a, b) // a 被累加二次

所以改寫成 template inline 函數(shù)


template<typename T>

inline void callWithMax( const T & a, const & b)

{

? ? f( a > b ? a : b) ;

}


條款3: 盡量使用 const ??

const的作用: 給編譯器添加約束丐膝, 告訴其他程序員和編譯器 這個值不變

例如:

class Rational{ ... } ;

const Rational operator * (? const Rational & lhs, const Rational & rhs);

如果不加const的話 (a * b) = c就會出現(xiàn)量愧。

const 成員函數(shù)

目的:

使 class 接口 比較容易被理解, 這樣得知哪個對象可以改動對象內(nèi)容而哪個函數(shù)不行是很重要的

操作const 對象(class 的對象)成為可能尤误, 有const 成員函數(shù)來處理取得修飾的const 對象

如:

const TextBlock ctb ("World");

std:cout >>? ct b[0]; // 調(diào)用const TextBlock operator [] const;


所以 一般函數(shù)里 ? void print( cosnt TextBlcok& ctb )

{

? ? ? ? std :: cout <<? ctb[0];

? ? ? ? ....

}

只要operator [] 重載并對不同版本給予不同的返回類型。 就可以有不同的處理结缚。


另外:

non- constt operator[] 的返回類型是reference to char, 不是char. 如果operator[]? 是返回一個char. 那么 tb[0] = 'x'


一般來說 定義const函數(shù)是想讓對象內(nèi)的任何一個bit不受更改损晤, 因此const成員函數(shù)不可以更改對象內(nèi)任何non-static的成員變量。?

但是這樣的觀點(diǎn)存在一個問題红竭,當(dāng)const成員函數(shù)返回一個非const 量尤勋, 那么可以更改對象內(nèi)的數(shù)據(jù)喘落。


使用mutable 可以讓non-staic成員變量的bitwise constness約束解除


另外一種解決辦法是讓non- static 函數(shù)調(diào)用 const-static函數(shù)

char & operator[] ( std ::? size_t position)

{

? ? ? ? return const_cast < char &> (static_cast <const TextBlock &> ( * this) [position];?

{

const_cast 去除 const?

static_cast 添加 const (針對對象本身)



條款4? 確定對象被使用前已先被初始化?

對于想default 狗仔一個成員變量, 同樣可以使用 member initialization list? 初始化

例如:


ABEntry:: ABEntry():theName(), theAddress(), thePhones(), numTimesConsulted()

{

}


對于不同的源碼文件最冰, 每一個內(nèi)含 一個non-local static 對象瘦棋。 如果編譯單元內(nèi)的某個 non-local static 對象使用了另外一個編譯單元的 non-lcaol-static 對象, 它所用到的這個對象可能尚未被初始化暖哨, 那么會出現(xiàn)初始化次序的重要性問題赌朋。



解決辦法:?

將這些對象放到自己的專屬函數(shù)內(nèi)。 這些函數(shù)內(nèi)返回一個reference 指向它包含的對象篇裁。 用戶調(diào)用這些函數(shù)沛慢。

保證獲得那個reference 將指向一個歷經(jīng)初始化的對象。


總結(jié):

手動初始化內(nèi)置型 non-member ( 賦值和初始化的花費(fèi)差不多)

使用成員初值列 對付對象的所有成分

最后在初始化次序不確定性 加強(qiáng)設(shè)計

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末达布,一起剝皮案震驚了整個濱河市团甲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黍聂,老刑警劉巖躺苦,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異产还,居然都是意外死亡匹厘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門雕沉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來集乔,“玉大人,你說我怎么就攤上這事坡椒∪怕罚” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵倔叼,是天一觀的道長汗唱。 經(jīng)常有香客問我,道長丈攒,這世上最難降的妖魔是什么哩罪? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮巡验,結(jié)果婚禮上际插,老公的妹妹穿的比我還像新娘。我一直安慰自己显设,他們只是感情好框弛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捕捂,像睡著了一般瑟枫。 火紅的嫁衣襯著肌膚如雪斗搞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天慷妙,我揣著相機(jī)與錄音僻焚,去河邊找鬼。 笑死膝擂,一個胖子當(dāng)著我的面吹牛虑啤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猿挚,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咐旧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绩蜻?” 一聲冷哼從身側(cè)響起铣墨,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎办绝,沒想到半個月后伊约,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孕蝉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年屡律,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片降淮。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡超埋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出佳鳖,到底是詐尸還是另有隱情霍殴,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布系吩,位于F島的核電站来庭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏穿挨。R本人自食惡果不足惜月弛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望科盛。 院中可真熱鬧帽衙,春花似錦、人聲如沸贞绵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冀泻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜡饵,已是汗流浹背弹渔。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溯祸,地道東北人肢专。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像焦辅,于是被迫代替她去往敵國和親博杖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355