《Effective C艹》讀書筆記(1)

2021-09-02 12:24:23 字數 1806 閱讀 4603

條款01:把c++當作乙個語言聯邦

c++不是簡單的「新增了物件導向特性的c語言」。我們可以認為c++是由以下四個次語言組成的語言。

2,物件導向c++:這一部分包含了 封裝,繼承,多型,等等物件導向程式設計語言最直觀的特徵。

3,template c++:泛型程式設計。

4,stl:是乙個template程式庫。包含有容器,迭代器,演算法,以及程式物件。

每個語言都有自己的規約。記住這4個語言你會發現c艹容易理解得多。

條款02:盡量以 const,enum,inline 替換 #define

預處理過程掃瞄源**,對其進行初步的轉換,產生新的源**提供給編譯器。檢查包含預處理指令的語句和巨集定義,並對源**進行相應的轉換。預處理過程還會刪除程式中的注釋和多餘的空白字元。可見預處理過程先於編譯器對源**進行處理。預處理指令是以#號開頭的**行。

當我們寫出如下**:

#define aspect_ratio 1.653
可能記號aspect_ratio並沒有被編譯器看見;也許在預處理階段她就被預處理器移走了。當由於這個記號發生了error的時候,編譯器的提示可能是1.653,而不是

aspect_ratio。這會讓人摸不到頭腦、

解決之道是使用常量來替換上面的巨集定義

const double aspect_ratio = 1.653;
作為乙個語言常量aspect_ratio肯定會被編譯器看到。因為預處理器是將目標進行盲目的替換,可能導致目標**出現多份1.653,若改用常量定義則不會出現這樣的情況。

使用常量有兩點需要注意:

1,定義常量指標。由於常量指標經常放在標頭檔案內,所以有必要將指標宣告為const。

const char *authorname = 「shenzi」;
在c++中定義字串最好使用string

cosnt std::string authorname("shenzi");
2,class專屬常量。為了限定這個常量的作用域在class內,必須要讓她成為乙個class成員。為了確認常量只有乙份實體,所以必須將其設定為static成員。

#includeusing namespace std;

class gp;

const int gp::ntm; //定義 如果沒有這句,接下來取位址會出錯

int main()

當然,由於部分編譯器不支援類內的宣告式上獲得初值,可以將初值放在定義式。

#includeusing namespace std;

class gp; 替換靜態變數

};const int gp::ntm = 5;

int main()

另一種常見的#define誤用情況是,其實現的巨集看起來很像函式,但是並沒有導致函式呼叫。

比如下面的**

#define fun(a,b) a*b;
我們進行如下運算

2.0/fun(1.0,2.0);
我們期望的演算法是 2.0 / (1.0 * 2.0)

但是編譯器會把**解釋為 

2.0 / 1.0 * 2.0

針對這種問題的解決方案是定義inline的模版函式

templateinline t fun(const t& a,const t& b)

《Effective C艹》讀書筆記(12)

條款十八 讓介面容易被正確使用,不易被誤用 如果我們設計乙個日期類,可能會寫成如下的模樣 class date 這個建構函式貌似沒有問題,但是她卻無法阻止使用者輸入錯誤的資料。比如使用者可能會把date 3,30,2015 寫成date 30,3,2015 所以說其實當你設計的程式需要假定使用者都能...

《Effective C艹》讀書筆記(14)

條款21 當必須返回物件時,別妄想返回其reference 並不是在任何情況下都可以通過傳引用的方式返回值。看下面這段 const rational operator const rational r1,const rational r2 事實上,任何對這個函式返回值的讀寫操作都將返回錯誤,因為返回...

《Effective C艹》讀書筆記(15)

條款22 將成員變數宣告為private 作為學生黨,經常在 裡把變數宣告為public,在外部直接進行訪問了事。這個條款告訴我們,這樣做是非常不科學的。1,private能夠提供非常完善的許可權控制,你可以直接控制乙個變數是唯讀,還是可讀可寫,甚至是只寫。而不是把使用這個類的各種許可權全部公開。2...