盡量用const、enum、inline替換#define
2.1 #define:以#開頭的**行是預處理指令。預處理指令是在編譯器進行編譯之前進行的操作,預處理過程掃瞄源**,對其進行初步的轉換,產生新的源**提供給編譯器。可見預處理過程先於編譯器對源**進行處理
2.2 巨集定義的常量是沒有型別的,巨集沒有型別安全檢查,所給出的是乙個立即數,在編譯器進行編譯的時候,巨集是直接替換的,並不會檢查錯誤,這個時候如果出現錯誤就不好排查了
2.3 編譯器通常不為普通const唯讀變數(基本資料型別的全域性變數)分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。const定義的唯讀變數從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,所以,const定義的唯讀變數在程式執行過程中只有乙份拷貝(因為它是全域性的唯讀變數,存放在靜態區),而#define定義的巨集常量在記憶體中有若干個拷貝
2.4 #define是全域性的,const有作用域之分;const可以使用extern關鍵字進行外鏈結
2.5 #define可以跨平台,#ifdef windows …… #else …… #endif
2.6 class專屬常量:委屈確保此常量至多只有乙份實體,你必須讓它成為乙個static成員。在類內的形如static const int num=5;為宣告而非定義。如果是類內專屬常量又是static且為整數型別(int,char,bool),只要不取位址,則無需提供定義
2.7 對於形似函式的巨集,最好改用inline函式替換#define
盡可能使用const
3.1 迭代器的作用相當於t* 指標,宣告迭代器為const就像宣告指標為const一樣,即宣告乙個t* const指標。
const std:
:vector
::iterator iter=vec.
begin()
;//iter相當於t* const
std:
:vector
::const_iterator citer=vec.
begin()
;//citer相當於const t*
3.2 盡量令函式返回乙個常量,可以避免==寫成=的錯誤
3.3 當const和non-const成員函式有著實質等價的實現時,令non-const版本呼叫const版本可避免**重複。但是不應該用const版本呼叫non-const版本,因為物件可能被改動,因為non-const可能改變物件
3.4 函式過載:當用實參初始化形參時會忽略掉頂層const,所以乙個擁有頂層const的形參和沒有頂層const的形參沒辦法過載。頂層const表示任意的物件是常量,用於宣告引用的const都是底層const(來自c++ primer第五版 57、190、208頁)
int i=0;
int *
const p1=
&i;//不能改變p1的值,是頂層const
const int ci=42;
//不能改變ci的值,是頂層const
const int *p2=
&ci;
//允許改變p2的值,是底層const
確定物件使用前已被初始化
4.1 class成員的初始化順序
4.2 成員是const或者reference必須初始化,不能賦值
4.3 不同編譯單元內定義的non-local static物件的初始化順序
4.3.1 函式內的static物件稱為local static物件,其他static物件稱為non-local static物件
4.3.2 編譯單元是指產出單一目標檔案的那些原始碼。基本上是單一原始碼檔案加上其所含入的標頭檔案
4.3.3將每個non-local static物件搬到自己的專屬函式內(該物件在此函式內被宣告為static)。這些函式返回乙個reference指向它所含的物件。也就是non-local static物件被local static物件替換了。reference-returning函式往往第一行定義並初始化乙個local static物件,第二行返回它
class
filesyetem
;filesystem&
tfs(
)class
directory
;directory :
:directory
(params)
directory&
tempdir()
Effective C 之導讀部分
宣告 文中內容收集整理自 effective c 本內容在作者現有能力的基礎上有所刪減,另加入部分作者自己的理解,有紕漏之處敬請指正。目錄 1.術語 宣告和定義 初始化值傳遞和const引用傳遞 2.命名習慣 3.關於執行緒 4.tr1和boost 1.宣告式 是告訴編譯器某個東西的名稱和型別,而略...
Effective C 學習筆記
學習effective c 已經有相當長的一段時間了,今天抽出時間又堵了一遍第一部分 c語言 c 以c語言為基礎,幾乎支援所有的c語言成分,例如區塊 語句 預處理 內建資料型別 陣列 指標等,c語言的侷限是 沒有模板 沒有異常 沒有過載 物件導向的c 也就是加上了物件特性的c,類 封裝 繼承 多型 ...
Effective C 學習筆記
1 c 是乙個複合式的語言 c 中不同部分有著不同的語言特性,例如 1.1 在c中傳遞形參時,按照值傳遞比按照指標傳遞效率更高 1.2 在物件導向程式中,物件要按照const引用而不是按照值傳遞 1.3 在stl程式設計中採取按照值傳遞方式 所以說c 中沒有統一的準則,要按照不同的特性採取不同的使用...