簡體   English   中英

我是否真的每次都想在原始類型之間進行轉換時使用static_cast?

[英]Should I really use static_cast every single time I want to convert between primitive types?

是什么讓這個

long l = 1;
char c = static_cast<char>(l);

float f = 1.0f;
int i = static_cast<int>(f);

比這更好

long l = 1;
char c = (char)l;

float f = 1.0f;
int i = (int)f;

何時將一個原始數據類型轉換為另一個?

我有很多遺留代碼在類似的情況下使用第二種樣式進行類型轉換,所以這也是一個問題,我是否可以不執行該代碼的全面修訂。

面向未來。

讓我們說將來我這樣做:

float blah = 1.0f;
float* f = &blah;

現在, int i = static_cast<int>(f); 停止編譯,但int i = (int)f; 做一個reinterpret_cast

static_cast<int> 這正是我想要你做的 (int) 盡你所能讓我得到一個int 對於后者,編譯器將不遺余力地為您獲取一個int值,而這很少(從不?)是可取的。

每一次都是一個跡象。

你不應該經常在原始類型之間進行轉換,因此每次輸入一些額外的字符是一項過於繁重的任務。 這有點像抱怨每次做一些危險的活動時都要戴頭盔。 如果你發現戴頭盔太煩人了,問題很可能是你經常從事危險活動而不是頭盔要求。

至於解決遺留代碼,您可以查看此問題以獲得一些答案(包括我自己的答案)。

是的你應該。

演員陣容是錯誤的主要來源。 它們是類型系統的方法,它是程序員可以使用的最好的錯誤捕獲程序之一。

static_cast比舊的c風格的演員更加明顯和更具體 你希望他們脫穎而出。 在調試時,您希望它們顯而易見。 你希望下一個程序員能夠理解你為什么要這樣做。

輸入static_cast<blah>(foo)更難的事實也是一個好處,因為它會鼓勵你只在絕對必要的情況下施放。

構造函數強制轉換是另一種選擇。 假設定義了轉換構造函數。 例如:

int i(0);
float f(3.14F);
i = int(f);

但是你肯定更喜歡static_cast廣播和其他C ++演員而不是C風格的演員static_cast ,因為那些基本上會說“嘗試每次演員直到有效”,這最終會達到相當於reinterpret_cast並且可能會給你不正確的行為。

C風格演員表的問題在於它可以讓你做你不想要的轉換。

這是你將來應該做的事情,但除非你找到問題,否則我不會回去改變它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM