2013-01-17 77 views
1

在C++中,c-casting與類型或參考類型有什麼區別?c-casting類型與c-casting類型的參考

foo = (unsigned int) whatever; 

// Is this the same as: 
foo = (unsigned int&) whatever; 
+0

這些是不同的問題,我確信這兩個問題之前已經被問及過很多次。儘管如此,避免「重複」票選的好辦法。你願意爲每個問題提出一個問題嗎? –

+1

2不是靜態鑄造。這是C型鑄造。改用'static_cast'。 –

+0

沒有任何保證(在C++中)所有枚舉都適合於一個無符號整數。在你的例子中,它會。 –

回答

5

不,它甚至不是相同的。

(在某些情況下,投的確切性質取決於什麼whatever是。我假設的whatever類型無關unsigned int。)

C-鑄造引用類型unsigned int &相當於執行reinterpret_cast於該類型

foo = reinterpret_cast<unsigned int &>(whatever); 

其是由定義相當於

foo = *reinterpret_cast<unsigned int *>(&whatever); 

whatever在這種情況下必須是左值。

換句話說,鑄造參考只是類型雙關的另一種方法。你很簡單重新解釋whatever佔用的內存作爲一個unsigned int對象。一般情況下,行爲是不確定的。例如,如果sizeof whatever小於unsigned int的大小,重新解釋還將涉及一些甚至不屬於whatever的「狂野」內存。

同時,非參考C-cast只是一個值轉換,而不是內存重新解釋。對於算術轉換爲unsigned int,它相當於static_cast(但如果whatever是指針,則相當於reinterpret_cast)。它讀取的值whatever並根據語言轉換規則(如果存在轉換)將其轉換爲unsigned int類型。

例如,這

float f = 5; 
unsigned int i = (unsigned int) f; 

值的f轉換成鍵入unsigned int,這意味着i將接收值5。同時,如果你的平臺上尺寸unsigned intfloat具有相同的大小,那麼這個

unsigned int i = (unsigned int &) f; 

會與實際價值5作爲unsigned int類型的對象重新詮釋float對象f的內部對象表示。 i的結果值通常是不可預知的。通常它不會接近5(在流行的實現中,您將僅收到i中原始float值的IEE754表示)。

+0

如果在源類型和目標類型之間存在繼承關係,則Nitpick,轉換爲引用也可以是靜態轉換。在一些具有多重繼承的場景中,這實際上很重要,因爲'reinterpret_cast'將提供一個指向源對象開始的指針,但'static_cast'會糾正指針以引用目標對象的開始。 (無論如何,因爲問題是關於'unsigned int') –

+0

@DavidRodríguez - dribeas:是的,謝謝。爲了避免將答案與細節重載,我假定我們正在專門討論將其轉換爲'unsigned int'。 – AnT

+1

reinterpret_cat iz在你的天花板,看着你轉換你的vrblz –