程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> EC讀書筆記系列之1:條款1、條款2、條款3,ec讀書筆記

EC讀書筆記系列之1:條款1、條款2、條款3,ec讀書筆記

編輯:C++入門知識

EC讀書筆記系列之1:條款1、條款2、條款3,ec讀書筆記


條款1:視C++為一個語言聯邦

記住:

  ★C++高效編程守則視狀況而變化,這取決於你使用C++的哪一部分

    C;

    Object-oriented c++;

    Template c++;

    STL

 

條款2:盡量以constenuminline替換#define

記住:

  ★對於單純常量,最好以const對象或enums替換#define

  ★對於形似函數的宏,最好改用inline函數替換#define

 ------------------------------------------------------------------------------------------------------

延伸:面試時經常會被問到的一個典型問題是:參數宏與函數的區別,我想可以從如下幾個角度來回答:

  a 函數調用要先求出實參表達式的值,然後代入形參;宏只是字符替換;

  b 宏替換只占編譯時間;函數調用占運行時間;

  c 函數運行時可調試,宏不可;

  d 函數會做參數類型檢查,宏不會;

  e 使用宏次數多時宏展開後源程序變長;函數調用不會;

 

條款3:盡可能使用const

記住:

  ★將某些東西聲明為const可幫助編譯器偵測出錯誤用法。const可被施加於任何作用域內的對象、函數參數、函數返回類型、成員函數本體

  ★編譯器強制實施bitwise constness,但你寫程序時應使用“概念上的常量性”(conceptual constness)

  ★當const和non-const成員函數有著實質等價的實現時,令non-const版本調用const版本可避免代碼重復

----------------------------------------------------------------------------------------------------------------------

1 一條規則:

  const出現在*左,表示被指物是常量: const int *p = NULL;

               *右,  指針自身是常量:int *const p = NULL;

               *兩邊,  兩者都是常量:const int *const p = NULL;

  對於被指物是常量的情形,const 寫在類型前後無關:const int *p 等價於 int const *p

 

2 STL迭代器中const的用法:

  迭代器自身是const的用法:  const std::vector<int>::iterator iter = vec.begin();

                *iter = 10; //可以,改變iter所指之物

                ++iter; //錯誤,iter自身是const

  迭代器所指之物是const的用法:std::vector<int>::const_iterator cIter = vec.begin();

                *cIter = 10; //錯,*cIter是const

                ++cIter; //沒問題,cIter本身可以變化

3 const成員函數

    將const實施於成員函數的目的是為了確認該成員函數可作用於const對象身上。這類成員函數重要的兩個原因:

  一、使class接口較容易被理解。因為可得知哪個函數可改動對象內容而哪個不行很是重要;

  二、使“操作const”對象成為可能。

4 bitwise constness(或physical constness)和logical constness

  利用mutable可釋放掉non-static成員變量的bitwise constness約束

5 constnon-const成員函數中避免重復

  利用const成員函數實現出其non-const成員函數:舉例:

    

 1 class TextBlock {
 2     ...
 3     const char& operator[]( std::size_t position ) const {  //const版本
 4         ...
 5         ...
 6         ...
 7         return text[position];
 8     }
 9     
10     char& operator[]( std::size_t position )  { //用const實現的non-const版本
11     
12         return
13             const_cast<char&>(
14             
15                 static_cast<const TextBlock&>(*this)[position] //轉換後調用const版[]
16             );
17     }
18     
19     ...
20 }

理解:這份代碼有兩個轉型動作

  一、將*this從其原始類型TextBlock&轉型為const TextBlock&(這使得接下來調用operator[]時得以調用const版本成員函數)

  二、從const operator[]的返回值中移除const

 

最後需要注意:non-const成員調用const成員可以,但反之不行!!!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved