條款1 4 讓自己習慣C

2021-10-24 15:59:06 字數 2614 閱讀 8168

#define aspect_ratio  1.653;  

//巨集定義的方式

const

double aspect_patio =

1.653

;//const常量的方式

#define定義的名稱無法追蹤,不易除錯;

#define比const常量定義會產生更多的目標碼

編譯器處理原始碼之前,預處理器就已經將原始碼中的aspect_ratio全部替換為1.653,因此aspect_ratio不會進入偵錯程式的記號表(symbol table),在編譯錯誤資訊內也只會顯示1.653,由於很可能巨集定義和編譯的不是乙個人,會疑惑1.653的來歷

//解釋:

由於c++支援分離式編譯,且對於常量需要在編譯期將常量物件替換為它們的值,而無需對non-

const做此替換動作。

因此對於普通的non-

const物件,在乙個原始檔定義,在其他使用到此變數的原始檔以extern宣告,這樣在分離式編譯時由於編譯器無需像對待const物件那樣將non-

const物件替換為它們的值,編譯可以通過。

而對於const物件就不能這麼做,如果直接在某一原始檔中定義,即使其它原始檔中使用extern宣告,在分離式編譯時(若沒一起編譯定義式所在的那個原始檔),由於編譯器無法完成替換動作造成編譯失敗。所以,const物件的作用域僅限於當前原始檔。若多個原始檔都想使用在乙個原始檔中定義的const物件,就把宣告式也宣告為extern。

class

gameplayer

const

int gameplayer::num =5;

//num的定義式,定義式不寫static且要指出所屬的類名

可以以列舉的成員作為陣列維度(即enum hack)

class

gameplayer

;//列舉的成員都是常量表示式,可以用在任何需要常量表示式的地方;

int socre[num]

;//由於num作為陣列的大小,因此必須在編譯期間,在類內陣列的宣告式處獲得維度的值;..

.}

將迭代器宣告為const   等價於  t*

const

//把迭代器看成乙個整體,這個const是作用在迭代器自身的

使用const_iterator 等價於 const t*

//const_iterator是作用在迭代器指向的物件的

法1. 可以在non-

const呼叫const版本的**實現**復用(很安全,且需要static_cast

<

const a&

>(*

this

),型別轉換後才能去呼叫const版本,否則會無限呼叫自身),而不能反過來復用(不安全)

法2. 把共同的部分寫成乙個單獨的private成員函式,供二者呼叫(由於定義在類內的成員函式隱式內聯,因此不會產生呼叫開銷,但要是這個共同函式實在是非常大,這個呼叫開銷就沒辦法了)

// 此處未對內建型別i初始化,預設初始化的含義是指:在為i分配記憶體時,沒有對獲得的那塊記憶體重新寫值,因此不知道i所屬的那塊記憶體裡面到底填的是啥;

int i;

//內建型別i的定義式,i獲得記憶體;

//對於內建型別來說, 先定義但不初始化,再對其賦值的開銷 和 直接在定義的時候初始化的開銷是相同的,都是先獲得記憶體,再執行一次寫操作

int i;

i =2

;等價於

int i =

2;

local-

static物件:函式內的static物件,在第一次呼叫該函式時執行到此static物件的定義式時初始化並分配記憶體,直到main結束才被銷毀;

non-local-

static物件:如global物件;namespace中定義的物件;在class內或file作用域中的static物件

解決方案:

為免除」跨編譯單元之初始化次序「問題,以local static 物件替換non-local static 物件;

即將每個non-local static 物件搬到自己的專屬static函式內成為乙個local-

static物件。這些函式返回乙個引用指向它所包含的static物件,然後使用者呼叫這些函式,而不直接使用這些物件。--

----

----

----

----

----

--即所謂的單例模式

之前是直接使用其他編譯單元的non-local-

static物件,可能使用的物件還沒被初始化完成;而現在通過呼叫那些專屬函式去得到local-

static物件,就可以保證得到的一定是初始化完成的,並且當沒呼叫這些函式時,也不會產生因定義static物件而產生的構造及析構開銷;

;使用inline 函式,可以更好的,提高這個簡短的函式的使用效能;

多執行緒環境下,應該在整體環境尚處在單執行緒時,手工呼叫那些reference-returning 函式,保證之後使用到的都是被初始化完成的物件,消除初始化有關的競速形式;

讓自己習慣c

c 是個多重范型程式語言,乙個同時支援過程形式 物件導向形式 函式形式 泛型形式 元程式設計形式的語言 1.c 區塊 語句 預處指標等來自於c。2.object oriented c class,封裝 繼承 多型等等 這部分是物件導向設計之古典守則在c 上最直接的實施。3.template c 這部...

讓自己習慣C

0.preface 前言 要認真弄清楚每個條款,還是很有必要自己讀一下 effective c 寫此篇部落格單純為了記錄下相關知識,以便日後複習 1.view c as a federation of languages.視c 為乙個語言聯邦 c 可以看作由四種次語言組成 cobject orien...

effective c 讓自己習慣c

一 忠告 a 對於常量,用const和 enum 代替define b 對於形似函式,用inline代替 define 二 盡量替換掉define的原因 a define a 1.63出錯時,報 1.63 出錯 const int a 1.63 出錯時,報 a出錯。顯然報變數名出錯更加容易除錯 b ...