C++: 類型轉換 static_const<>
static_cast <new_type> (expression)
Examples:
int current_dma_viewership = 10; int64 total_dma_concurrent_viewership_;double score = total_dma_concurrent_viewership_ != 0 ? (static_cast<double>(current_dma_viewership) / total_dma_concurrent_viewership_) : 0.0;
for (const int type : config_->types()) { const auto video_type = static_cast<ChannelServiceVideosNominatorConfig::VideoType>(type);Home of IBM product documentation for (const int type : config_->types()) { const auto video_type = static_cast<ChannelServiceVideosNominatorConfig::VideoType>(type);
f(const int64 time_now_secs, const int64 refresh_interval_secs) {size_t offset = util_hash::Hash(item) % static_cast<size_t>(refresh_interval_secs); size_t interval = (static_cast<size_t>(time_now_secs) + offset) / static_cast<size_t>(refresh_interval_secs);}
來源:為什麼需要static_cast強制轉換?
情況1:void指針->其他類型指針
情況2:改變通常的標準轉換
情況3:避免出現可能多種轉換的歧義
它主要有如下幾種用法:
- 用於類層次結構中基類和子類之間指針或引用的轉換。進行上行轉換(把子類的指針或引用轉換成基類表示)是安全的;進行下行轉換(把基類指針或引用轉換成子類指針或引用)時,由於沒有動態類型檢查,所以是不安全的。
- 用於基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
- 把void指針轉換成目標類型的指針(不安全!!)
- 把任何類型的表達式轉換成void類型。
注意:static_cast不能轉換掉expression的const、volitale、或者__unaligned屬性。
What static_cast is actually doing
float f = 12.3;float* pf = &f;// static cast<>// OK, n = 12int n = static_cast<int>(f);// Error, types pointed to are unrelatedint* pn = static_cast<int*>(pf);// OKvoid* pv = static_cast<void*>(pf);// OK, but *pn2 is rubbishint* pn2 = static_cast<int*>(pv);// reinterpret_cast<>// Error, the compiler know you should// call static_cast<>int i = reinterpret_cast<int>(f);// OK, but *pn is actually rubbish, same as *pn2int* pi = reinterpret_cast<int*>(pf);
In short,static_cast<>
will try to convert, e.g., float-to-integer, whilereinterpret_cast<>
simply changes the compilers mind to reconsider that object as another type.
推薦閱讀:
※假如你可以個人主導 C++,你打算怎樣裁剪、擴充和訂製 C++ 來達到你心中最完美的 C++?
※大佬,我代碼哪錯了?
※JS中的閉包為何會產生副作用,即閉包只能取得包含函數中任何變數的最後一個值?
※為什麼編碼仍然是未來最重要的工作技巧
※Pixel Perfect Rotation 效果投票!