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,當呼叫者...