Effective C 條款03 不止於此

2021-10-09 23:22:26 字數 1697 閱讀 2666

首先明確 : const量不可變, * 代表被指的資料,名字代表指標位址

char gre=

"hello"

;//前面講過不如 const std::string ptr = "hello"

char

*ptr = gre;

//這是只是演示

const

char

* ptr = gre;

//常資料,非常指標

char

*const ptr = gre;

//常指標,非常資料

const

char

*const ptr = gre;

//常指標,常資料

//補充:

const

char

* ptr =

"hello"

;//若是指標只能指向字元常量

const

char

*const ptr =

"hello"

;//ok!

//but

char

*const ptr =

"hello"

;//報錯

char

* ptr =

"hello"

;//報錯,指標要指向乙個位址或引用,不能指向字元或字串

//指標可以為0;int* p = 0;但不能給其賦值,int* p = 1;//錯誤!

說明:

const出現在 * 左邊,表示被指物是常量;出現在 * 右邊,表示指標自身是常量;出現在 * 兩邊,表示被指物和指標兩者都是常量。

下面兩種寫法不一樣,但意義相同

int

const

* ptr;

const

int* ptr;

//都是非常指標,常資料

☆ 常(const)成員函式不能給非靜態成員變數賦值,除非用mutable

例:

class

class

;std::size_t length()

const

return textlength;

}

而加上 mutable 後:

class

class

;std::size_t length()

const

return textlength;

}

但mutable不能解決所有問題。

在常成員函式內不能呼叫 non-const 成員函式,必須先經過 const_cast 將 const 屬性去掉,然後才能安全呼叫。但在 non-const 成員函式中呼叫乙個 const 並不會帶來風險。更詳細的內容將在後面的條款中介紹。

最後請記住:

將某些東西宣告為 const 可以幫助編譯器偵測出錯誤用法。const 可被施加於任何作用域內的物件、函式引數、函式返回型別、成員函式本體。

編譯器強制實施 bitwise constness ,但你編寫程式是應該使用「概念上的常量性」(conceptual constness)。

當 const 和 non-const 成員函式有著實質等價的實現時,令 non-const 版本呼叫 const 版本可避免**重複。

Effective C 經驗條款

高效c 4 必須返回物件時,別妄想返回其reference 這句話什麼意思呢?就是在乙個函式內,如果你需要這個函式返回乙個新的物件,那麼這個函式的返回值型別就不要定義成引用型別。就直接返回這個類型別。首先,我們知道在函式傳遞引數時,傳遞引用的好處,尤其是對那麼比較大的型別,但是對於內建型別和stl的...

effective c 條款總結

條款1 盡量用const 和inline 而不用 define 條款2 盡量用而不用 條款3 盡量用new delete 而不用malloc free 條款4 盡量使用c 風格注釋 條款5 對應的new和delete 都要採用相同的形式 條款6 析構函式裡對指標成員呼叫delete條款 條款7 預先...

Effective C 經驗條款

高效c 模板與泛型程式設計 在c 中模板體現的是編譯期多型,virtual體現的是執行期多型。關於typename的雙重含義 在宣告template引數時,不論使用keywordclass或typename,意義全然同樣。可是c 並不總是把class和typename視為等價。有時候必須使用type...