Effective C 盡量使用const

2021-09-28 15:56:40 字數 2102 閱讀 3807

char greeting = "hello";

char *p = greeting;

const char *p = greeting;

char * const p = greeting;

const char * const p = greeting;

const在 *

號左邊,代表指標指向的物件是const的。如果在右邊,代表這個指標是const的。

void f1(const widget *pw); // f1 takes a pointer to a constant widget object

void f2(widget const *pw); // so does f2

std::vectorvec;

const std::vector::iterator iter = vec.begin() ;//指標本身是const的

*iter = 10; // right

++iter; // error

std::vector::const_iterator citer = vec.begin( ); //指標指向的物件是const的

*citer = 10; // error

++citer; // right

class rational ;

const rational operator*(const rational& lhs, const rational& rhs);

返回值為const的原因

if 錯用

if (a * b = c) ...
書寫錯誤

rational a, b, c;

(a * b) = c;

同函式內部的local const一樣。

得知那個函式可以改動物件內容

如果兩個成員函式常量性不同,則他們可以過載。

class textblock 

char& operator(std::size_t position)

private:

std::string text;

};textblock tb("hello");

std::cout << tb[0]; // call non-const version

const textblock ctb("world");

std::cout << ctb[0]; // call const version

應用

void print(const textblock& ctb)

std::cout << tb[0];

tb[0] = 』x』;

std::cout << ctb[0];

ctb[0] = 』x』; // error

缺點

class ctextblock 

private:

char *ptext;

};

比如這樣做

const ctextblock cctb("hello");

char *pc = &cctb[0];

*pc = 』j』;

乙個函式可以修改某些類裡面的變數,但是被外部使用者感知到。

class ctextblock ;

std::size_t ctextblock::length() const

return textlength;

}

怎麼辦?

class ctextblock ;

std::size_t ctextblock::length() const

return textlength;

}

class textblock 

char& operator (std::size_t position)

};

盡量少做轉型動作 《Effective C 》

背景 c 規則的設計目標之一 保證型別錯誤絕不可發生。非常重要 乙個程式能乾淨地通過編譯,表示 該程式不會在任何物件身上執行 任何不安全,無意義 愚蠢的操作。但轉型破壞型別系統。可能會導致麻煩。c 提供的轉型方案 const cast expression dynamic cast expressi...

條款4 盡量使用c 風格的注釋

舊的c注釋語法在c 裡還可以用,c 新發明的行尾注釋語法也有其過人之處。例如下面這種情形 if a b 假設你出於某種原因要注釋掉這個 塊。從軟體工程的角度看,寫這段 的程式設計師也做得很好,他最初的 裡也寫了乙個注釋,以解釋 在做什麼。用c 形式的句法來注釋掉這個程式塊時,嵌在裡面的最初的注釋不受...

盡量使用標準的異常

我們盡量去使用jdk的標準異常。為什麼?第一,使用標準異常和程式設計師原來已經熟悉的api是一致的。第二,可讀性好。不會出現程式設計師不熟悉的異常。第三,使用異常類越少,意味著記憶體占用就越小,並且裝載這些類的時間開銷也越小。最常用的異常是 illegalargumentexception,當呼叫者...