c++通過引進四個新的型別轉換操作符克服了 c 風格型別轉換的缺點, 這四個操作符是,static_cast, const_cast, dynamic_cast, 和 reinterpret_cast。在大多數情況下,對於這些操作符你只需要知道原來你習慣於這樣寫【(type) expression】而現在你總應該這樣寫【static_cast(expression)】
static_cast在功能上基本上與 c 風格的型別轉換一樣強大,含義也一樣。它也有功能上限制。例如,你不能用 static_cast 象用 c 風格的型別轉換一樣把 struct 轉換成 int 型別或者把 double 型別轉換成指標型別。
double result = static_cast(firstnumber)/secondnumber;
const_cast用於型別轉換掉表示式的 const 或 volatileness 屬性。通過使用 const_cast,你向人們和編譯器強調你通過型別轉換想做的只是改變一些東西的 constness 或者 volatileness 屬性。
class widget ;
class specialwidget: public widget ;
void update(specialwidget *psw);
specialwidget sw; // sw 是乙個非 const 物件。
const specialwidget& csw = sw; // csw 是 sw 的乙個引用,它是乙個 const 物件
update(&csw); // 錯誤!不能傳遞乙個 const specialwidget* 變數
update(const_cast(&csw));// 正確,csw 的 const 被顯示地轉換掉
update((specialwidget*)&csw);// 同上,但用了乙個更難識別的 c 風格的型別轉換
dynamic_cast用於安全地沿著類的繼承關係向下進行型別轉換。這就是說,你能用 dynamic_cast 把指向基類的指標或引用轉換成指向其派生類或其兄弟類的指標或引用,而且你能知道轉換是否成功。失敗的轉換將返回空指標(當對指標進行型別轉換時)或者丟擲異常(當對引用進行型別轉換時)
widget *pw = new specialwidget;
update(pw); // 錯誤!pw 的型別是 widget*,但是update 函式處理的是 specialwidget*型別
update(dynamic_cast(pw));// 正確,傳遞給 update 函式乙個指標是指向變數型別為 specialwidget 的指標
reinterpret_casts的最普通的用途就是在函式指標型別之間進行轉換。例如,假設你有乙個函式指標陣列:
typedef void (*funcptr)(); // funcptr is 乙個指向函式的指標,該函式沒有引數,返回值型別為 void
funcptr funcptrarray[10]; // funcptrarray 是乙個能容納10 個 funcptrs 指標的陣列
讓我們假設你希望(因為某些莫名其妙的原因)把乙個指向下面函式的指標存入funcptrarray 陣列:int dosomething();
你不能不經過型別轉換而直接去做,因為 dosomething 函式對於 funcptrarray 陣列來說有乙個錯誤的型別。在 funcptrarray 陣列裡的函式返回值是 void 型別,而 dosomething函式返回值是 int 型別。
funcptrarray[0] = &dosomething; // 錯誤!型別不匹配
funcptrarray[0] = reinterpret_cast(&dosomething);//reinterpret_cast 可以讓你迫使編譯器以你的方法去看待它們
ITEM2盡量使用C 風格的型別轉換
原則 型別轉換要力求語義明確。c風格型別轉換允許使用者在任意兩個型別間進行轉換,不對轉換進行細分且語義不明確。c 風格的型別轉換操作符 static cast 基本與c風格型別轉換類似 const cast 去掉表示式的const或volatileness屬性 dynamic cast 安全的沿著類...
item2使用Solarized主題
要在 mac os x 終端裡舒服的使用命令列 至少 需要給3個工具配色,terminal vim 和 ls.git clone git iterm2,preferences profile colors load presets 字型大小 preferences profile text 2 配置...
item2實現ssh的免密登入
編寫expect指令碼 1 新建指令碼 指令碼位置沒有明確要求 touch ssh info.sh2 指令碼內容 usr bin expect set timeout 30 spawn ssh p lindex ar 0 lindex ar 1 lindex ar 2 expect password...