成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

c++代碼優(yōu)化~effective c++總結(jié) 10.12

elva / 857人閱讀

摘要:出現(xiàn)在左邊表示被指物是常量,出現(xiàn)在右邊表示指針自身是常量。沒(méi)問(wèn)題改變的是所指物錯(cuò)誤是在函數(shù)聲明時(shí)的應(yīng)用令函數(shù)返回一個(gè)常量,往往可以降低因客戶(hù)錯(cuò)誤導(dǎo)致的意外??偨Y(jié)將某些東西聲明為可以幫廚編譯器偵測(cè)出錯(cuò)誤用法。

?一、習(xí)慣c++

1.盡量使用const,enum,inline替換#define

在學(xué)習(xí)c的過(guò)程中我們經(jīng)常用#define來(lái)進(jìn)行預(yù)處理操作,但#define并未被視作語(yǔ)言的一部分,因此也會(huì)帶來(lái)許多的問(wèn)題。

? #define i? 5?

在這條預(yù)處理命令中i被定義為5,但是在編譯過(guò)程中所有的i都被替換為5,可能會(huì)導(dǎo)致i并沒(méi)有進(jìn)入符號(hào)表中。當(dāng)你使用這個(gè)常量進(jìn)行編譯報(bào)錯(cuò)時(shí),并不會(huì)提示i出錯(cuò)。而是會(huì)提到5這個(gè)數(shù)字。

如果對(duì)記號(hào)表不太理解可以看一下這篇文章

https://www.cnblogs.com/programnote/p/4729467.html

但是在使用const定義時(shí)并不會(huì)出現(xiàn)這種問(wèn)題,因?yàn)槟愕膇已經(jīng)被保存在符號(hào)表。

當(dāng)我們以常量替換#define時(shí)需要注意

1.定義常量指針時(shí),因?yàn)槌A慷x需要放在頭文件中以便被其他的源碼所使用。

所以我們需要把指針聲明為const。對(duì)于在 * 左右表示的不同含義在下文中會(huì)有所提及。

這里給出一個(gè)例子:

const char* const name=“jam”;

但是在c++中我們已經(jīng)學(xué)了string,所以用string替換會(huì)達(dá)到更好的效果

const std::string name("jam");

2.定義類(lèi)的專(zhuān)屬常量

我們?cè)诙xclass的專(zhuān)屬常量時(shí)需要將常量的作用域限制在class內(nèi),但是#define不能用來(lái)定義class的專(zhuān)屬常量,也不能提供任何的封裝性。?

?我們知道enum也可以用來(lái)定義常量,但是enum的行為比較像define而不像const,因?yàn)槲覀兛梢匀〉靡粋€(gè)const的地址,而不能取得enum和#define的地址。如果你不想讓一個(gè)指針來(lái)指向你的某個(gè)整數(shù)常量,那么你可以試試enum;同時(shí)enum和#define一樣不會(huì)導(dǎo)致非必要的內(nèi)存分配。


?使用#define來(lái)實(shí)現(xiàn)宏時(shí)雖然不會(huì)帶來(lái)函數(shù)調(diào)用的額外開(kāi)銷(xiāo),但會(huì)帶來(lái)許多麻煩

例如

#define? MAX(A,B) (A) > (B) ? (A) : (B)

只是看著這些括號(hào)就讓人很不舒服吧。

如果不加括號(hào)會(huì)帶來(lái)更多的麻煩

例如:

#define? ADD(a)? a+a

當(dāng)兩個(gè)add相乘時(shí)結(jié)果會(huì)是多么糟糕。

當(dāng)我們使用template inline函數(shù)時(shí)

template

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

{

f(a > b ? a : b );//函數(shù)內(nèi)函數(shù)調(diào)用的實(shí)現(xiàn),再次不多解釋
}

這樣我們就不用擔(dān)心參數(shù)核算的問(wèn)題了,另外max也是真正的函數(shù)遵循作用域和訪(fǎng)問(wèn)規(guī)則。

總結(jié):1.對(duì)于單純的常量,最好用const對(duì)象或enums替換;

? ? ? ? ?2.對(duì)于形似函數(shù)的宏,最好用inline函數(shù)替換。?

二、盡可能使用const

const用于告訴編譯器某個(gè)值保持不變,可以修飾class外部的global 或namespace中的常量,或者修飾文件、函數(shù)中的static對(duì)象。

const出現(xiàn)在*左邊表示被指物是常量,出現(xiàn)在*右邊表示指針自身是常量。

vectorv;

const std::vector::iterator iter=v.begin();

*iter=10;//沒(méi)問(wèn)題改變的是iter所指物

++iter;//錯(cuò)誤iter是const;

const在函數(shù)聲明時(shí)的應(yīng)用:

令函數(shù)返回一個(gè)常量,往往可以降低因客戶(hù)錯(cuò)誤導(dǎo)致的意外。

這里寫(xiě)一段簡(jiǎn)潔的代碼看一下

class ans{};

const ans operator*(const ans&lhs,const ans& rhs);

ans a b c;

if(a*b=c);//實(shí)際想做比較操作

我們?cè)谑褂胏onst作為返回值時(shí),如果出現(xiàn)這種無(wú)意義的賦值操作就會(huì)報(bào)錯(cuò)(一般情況不會(huì)報(bào)錯(cuò),使得許多人很苦惱)

在繼續(xù)const的使用說(shuō)明前希望大家可以看一下這篇文章了解bitwise const和logical const

http://blog.sina.com.cn/s/blog_477141850101hooy.html

當(dāng)const和non-const成員函數(shù)有著實(shí)質(zhì)等價(jià)的實(shí)現(xiàn)時(shí),令non-const版本調(diào)用const版本可以避免代碼重復(fù)。但是切記不可一用const版本調(diào)用non-const版本,因?yàn)閏onst成員函數(shù)承諾絕不改變其對(duì)象的邏輯狀態(tài)。

例如

class text{public:const char& operator[](std::size_t position)const{...return text[position]}char& operator[](std::size_t position){...return text[position]}private:std::string t;}

當(dāng)兩個(gè)函數(shù)的功能一樣時(shí),可能會(huì)調(diào)用兩次,這樣會(huì)造成編譯時(shí)間,代碼膨脹等問(wèn)題。

c++四種cast用法

我們可以這么修改代碼

class text{public:const char& operator[](std::size_t position) const{...;return text[position];}char& operator[](std::size_t position){...;return const_cast(static_cast(*this)[position];};

轉(zhuǎn)型(cast)大家可以點(diǎn)擊上面鏈接查找資料。

如果不轉(zhuǎn)型為const那么non-const函數(shù)只會(huì)無(wú)窮的遞歸調(diào)用自己,注意我們寫(xiě)的是操作符重載函數(shù),將非const對(duì)象轉(zhuǎn)型為了const對(duì)象,這樣我們就避免了代碼重復(fù)。

總結(jié):

1.將某些東西聲明為const可以幫廚編譯器偵測(cè)出錯(cuò)誤用法。

2.const可以被施加于任何作用域內(nèi)的對(duì)象、函數(shù)、函數(shù)參數(shù)、函數(shù)返回類(lèi)型。

3.當(dāng)const和non-const成員函數(shù)有著實(shí)質(zhì)等價(jià)的實(shí)現(xiàn)時(shí),令non-const版本調(diào)用const版本可以避免代碼重復(fù)。但是切記不可一用const版本調(diào)用non-const版本,因?yàn)閏onst成員函數(shù)承諾絕不改變其對(duì)象的邏輯狀態(tài)。

三、最后保證所有對(duì)象使用前都已被初始化?

這個(gè)方面就不多解釋了,直接總結(jié)一下吧

1.為內(nèi)置型對(duì)象進(jìn)行手工初始化,因?yàn)閏++不保證初始化他們。

2.構(gòu)造函數(shù)最好使用成員初值列,而不要再構(gòu)造函數(shù)本體內(nèi)使用賦值操作。初值列列出的成員變量,排列次序應(yīng)該與class中的聲明次序相同。

例如:

class text{
public:

text();

int myid;

string myname;

}

text::text(const std::int&id,const string& name):myid(id),myname(name)

{};

最好使用local static對(duì)象替換 non-local static對(duì)象。免除“跨編譯單元的初始化次序”問(wèn)題。

?本篇文章的主要參考書(shū)籍是《effective c++》,用更短的篇幅來(lái)讓大家獲得相同的知識(shí),同時(shí)也是我在學(xué)習(xí)《effective c++》時(shí)所做的一些總結(jié),希望能幫到大家。同時(shí)我也會(huì)陸續(xù)將本書(shū)中的9個(gè)模塊全部更新完,喜歡的小伙伴們就關(guān)注一下我吧。希望在學(xué)習(xí)c++的路上能有更多的小伙伴

?

?

?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/122426.html

相關(guān)文章

  • 我是如何學(xué)習(xí)游戲引擎的?

    摘要:下面列舉了游戲開(kāi)發(fā)中常見(jiàn)的崗位以及兩條常見(jiàn)的協(xié)作開(kāi)發(fā)的流水線(xiàn)其實(shí)學(xué)習(xí)游戲引擎,前期對(duì)于任何崗位來(lái)說(shuō)路線(xiàn)都是相似的,基本上就是一個(gè)熟悉基本操作理解基本概念拓展專(zhuān)業(yè)知識(shí)的過(guò)程。當(dāng)然這不是絕對(duì)的,任何引擎的開(kāi)始階段和大成階段都是相似的。 這是【游戲開(kāi)發(fā)那些事】第51篇原創(chuàng) 前言:游戲引擎,表面...

    未東興 評(píng)論0 收藏0
  • [初識(shí)C++] 何為最:心酸歷史

    摘要:上面需要了解的是這倆個(gè)版本都是破蛹成蝶的版本世界挑戰(zhàn)榜咋才前三還沒(méi)擠進(jìn)去呀,你想想世界上有幾千中編程語(yǔ)言,在其中脫穎出來(lái),可以說(shuō)是天之?huà)勺?,鳳毛麟角了。支持正版圖靈上面買(mǎi)吧,如果沒(méi)錢(qián)買(mǎi)盜版吧學(xué)完以后買(mǎi)本正版支持一下,創(chuàng)作不易是吧 ...

    forrest23 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<