Effective C 筆記 導讀及第一章

2021-09-24 02:47:16 字數 2226 閱讀 1225

盡量用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 中沒有統一的準則,要按照不同的特性採取不同的使用...