Effective C++ --1 让自己习惯C++
1、視C++為一個語言聯邦
C++主要的次語言有四種:C、Object-Oriented C++、Template C++和STL。
2、盡量以const,enum,inline替換#define
(1) #define單純常量,編譯前需要預處理器,沒有進入編譯的符號表,出錯信息不容易定位。
(2) #define 不能用于定義常量指針,對const取地址合法,對#define取地址不合法;沒有作用域的限制,不能成為類的專屬成員。
(3) #define 定義宏,括號問題,容易出錯,應以inline代替。
補充:后在《c和指針》中看到一些 #define 不能用函數替換的情況,但是在C++中都不是問題:
(1) 函數的參數必須聲明為一種特定的類型,所以只適合在類型合適的表達式上使用。如果用模板,函數也可以實現多種類型,C++模板有類型推導同樣不需要進行顯示表明。
(2) 宏的參數如果是一種類型,無法作為函數參數傳遞。
在C++中,可以用typeid(X).name()獲知變量的類型,或者使用模板,在模板函數中定義此類型變量等。
3、盡可能使用const
??(1) 將函數的返回值聲明為const可以防止被當做左值被賦值。
?? (2)成員函數const有兩種理解,bitwise constness和logical constness。前者主張const成員函數不更改對象之任何成員變量,也即不更改對象內的任何一個bit;后者主張const成員函數可以修改所處理的對象內的某些bits,但只有在客戶端偵測不出的情況下。前者對象內指針所指之物發生變化亦可,后者要添加mutable來表示對象成員可以改變。
? ?(3)“常量性轉移”,令non-const版本調用const版本來避免代碼重復。
4、確定對象被使用前已先被初始化
?(1) 內置類型手工初始化;非內置類型構造函數初始化時利用初始化列表,使成員變量初始化發生在進入構造函數之前,此時調用的是拷貝構造函數,而非調用默認構造函數再進行拷貝賦值,這樣可以提高效率。
(2) 成員變量初始化次序與聲明次序相同。
? (3)c++定義于不同編譯單元內的non-local static對象的初始化次序沒有明確定義,為此,以local static對象替換為non-local static對象。
總結
以上是生活随笔為你收集整理的Effective C++ --1 让自己习惯C++的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《STL源码剖析》学习--STL体现的思
- 下一篇: Effective C++ --2 构造