Monday 15 December 2008

casting in c++

從來沒注意玩 casting 可以有幾多花臣,平常只是做普通承繼類的 casting。早前對比兩個相似的 timers 時,發覺其中一個用上兩個 casting,於是網上一查,原來 casting 可以很暴力,再看看一書 The C++ Programming Language 的附錄:casting away const (p.414),暈。

const_cast、static_cast、reinterpret_cast
(src: http://www.hala.bz/read.php?tid=7186&toread=1&fpage=1)

const_cast用於一些特殊場合可以覆寫變數的const屬性,利用cast後的指標就可以更改變數的內部,其語法如下:
  const_cast<target_type>(expr)
以下為const_cast的簡單示範:
#include iostream
using namespace std;
void foo(const int*);
int main() {
  int var = 10;
  cout var = var endl;
  foo(&var);
  cout var = var endl;
  return 0;
}
void foo(const int* p) {
  int* v = const_castint* (p);
  *v = 20;
}
執行結果:var = 10
     var = 20

static_cast可用於轉換基底類別指標為衍生類別指標,也可用於傳統的資料型態轉換,其語法如下:
  static_cast<target_type>(expr)
以下為static_cast的簡單示範:
#include iostream
using namespace std;
int main() {
int intVar;
  float fltVar = 3.14159;
  intVar = static_castint (fltVar);
  cout intVar = intVar endl;
  return 0;
}
執行結果:intVar = 3

reinterpret_cast用於將一種型態的指標轉換為另一種型態的指標,例如將void*轉換為char*,其語法如下:
  reinterpret_cast<target_type>(expr)
以下為reinterpret_cast的簡單示範:
#include iostream
using namespace std;
int main() {
  int i;
  char* str = 測試;
  i = reinterpret_castint (str);
  cout i;
  return 0;
}
執行結果:134514308


Google

No comments: