- 習慣 C++
- 1. C++ 是一個語言聯邦
- 區別
- conclusion 總結
- 2. 盡量用const,enum,inline,替換#define
- const 的使用
- enum 的使用
- inline 的使用
- conclusion 總結
- 1. C++ 是一個語言聯邦
習慣 C++
1. C++ 是一個語言聯邦
- c 部分
-
最成功的的高級語言,他奠定了高級語言的基礎,設計了區塊blacks,陳述句statement,前處理器preprocesser,內置型別build-in-type,陣列array,指標pointer,很多時候c++不過是更加高級的c解法
-
面向程序的高級編程語言,與計算機底層和匯編關系密切,你可以詳細的控制cpu的每一次操作,通過代碼知道編譯陳述句的內容,問題是,程式員面臨著大量的潛在bug而無法從語言上獲得幫助,陣列的初值不確定,動態記憶體要自己管理,每一次指標的操作都可能使得程式崩潰,
-
面向工程的巨大缺陷,無法面向物件,只有結構體,沒有類class,沒有模板template,沒有例外,沒有多載
- Object-Oriented C
- 原生面向物件的c語言,c with classes:classes(包括構造和解構式),封裝(encapsolution),繼承(inheritance),多型(polymorphism),virtual(動態系結),...
- tempate C++
- 泛型編程, 編程守則"唯泛型適用",TMP編程范式(template meta progranmming),但除了你是設計團隊,大部分你只要用就行了,而且template和c++主流編程沒有什么影響
- STL
- stl是個template程式庫,極佳的緊密配合和協調了 容器(container),迭代器(iterraters),演算法(algorithm),以及函式物件function Object的規約,如果你要使用它,就得遵守他的規約.
區別
- c部分pass by value 更好,只有指標和基礎型別
- 然而Object-Oriented C 和 template C++由于有構造和解構式的classes ,pass-by-reference-to-const更加高效,
- 然而使用STL時,由于stl的迭代器和函式物件都是基于指標構建的,pass-by-value 再次適用
conclusion 總結
- C++ 高效編程守則視現狀而定,取決于你使用C++的哪一部分
2. 盡量用const,enum,inline,替換#define
-
寧可編譯器而不是前處理器, 因為#define 設計就不是語言的一部分,編譯器很多情況下報錯無法追蹤,因為#define 沒有記名表,沒有變數名,在編譯器眼里是常量,只會報錯常量,而你無法通過常量追蹤報錯位置,除錯的時候更是這樣
-
#define 不提供封裝性,作用域控制,即static,class member,private,protect
-
eg #define ASP 1.63 -> const double ASP = 1.63
const 的使用
- c part (based-on-char*) eg :
const char * str const = "hello effective cpp";
- 在星號前的const代表修飾*str,即str所指向的記憶體存盤的值不可變
- 在星號后的const修飾str,代表該指標的值不可變,即不能指向別的記憶體
- c++ part(based-on-classes)string :
const std::string str("hello effective cpp");
- classes 專屬常量 for class scope define as a class member, for single store define as static
class GamePlayer{
private:
static const int NumTurns = 5; // 常量宣告式
int score[NumTurns]; //使用該常量
...
};
- 如果這個常量不是整數型變數型別 byte,int,char,bool 或者你需要取這個常量的地址,你必須在class外提供定義式,參考頭檔案和源檔案的關系理解,第一次為宣告,第二次為定義,由于const的屬性而顯得奇怪,下面會解釋原因
const int GamePlayer::NumTurn;
- 由于已經在宣告時賦值,const使得不可再次賦值
- 在檔案內的static已有特殊定義,即檔案內部常量,不可被檔案外部使用,對應extern,對于class static member的作用域,顯然不合理,所以不可使用static,而使用extern,而extern可省略
enum 的使用
- 當你的編譯器(錯誤的)不允許"static整數常量"完成"class int初值設定",使用the enum hack ,enum補償法
class GamePlayer{
enum{NumTurns=5};
int scores[NumTurns];
}
- enum 無法被取地址更安全,而const 可以, 然后enum是TMP (template mete programming)的基礎技術
inline 的使用
- 使用#define而避免函式呼叫的開銷
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
- 錯誤情況
int a=5,b=0;
CALL_WITH_MAX(++a,b);
CALL_WITH_MAX(++a,b+10);
- 使用inline
template<T>
inline void call_with__max(T a,T b){
f(a>b?a:b);
}
conclusion 總結
- 對于單純常量,最好以const物件或者enums替換#define
- 對于形似函式的宏(micros), 最好改用inline函式替換#define
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500552.html
標籤:C++
下一篇:錯排問題詳解
