国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

elva / 851人閱讀

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

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

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

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

? #define i? 5?

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

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

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

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

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

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

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

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

const char* const name=“jam”;

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

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

2.定義類的專屬常量

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

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


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

例如

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

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

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

例如:

#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ù)核算的問題了,另外max也是真正的函數(shù)遵循作用域和訪問規(guī)則。

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

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

二、盡可能使用const

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

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

vectorv;

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

*iter=10;//沒問題改變的是iter所指物

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

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

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

這里寫一段簡潔的代碼看一下

class ans{};

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

ans a b c;

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

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

在繼續(xù)const的使用說明前希望大家可以看一下這篇文章了解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ù)承諾絕不改變其對象的邏輯狀態(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í)間,代碼膨脹等問題。

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ì)無窮的遞歸調(diào)用自己,注意我們寫的是操作符重載函數(shù),將非const對象轉(zhuǎn)型為了const對象,這樣我們就避免了代碼重復(fù)。

總結(jié):

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

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

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ù)承諾絕不改變其對象的邏輯狀態(tài)。

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

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

1.為內(nèi)置型對象進(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對象替換 non-local static對象。免除“跨編譯單元的初始化次序”問題。

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

?

?

?

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/122426.html

相關(guān)文章

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

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

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

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

    forrest23 評論0 收藏0

發(fā)表評論

0條評論

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