2012-01-16 89 views
3

可能重複:
What is the difference between (type)value and type(value)?類型(可變)VS(類型)可變

我主要是C#開發人員等使用的語法像做了很多明確的鑄造:(type)variable,以(int)100.0004d爲例。因此,當用C++編寫代碼時,我經常使用相同的語法。但是,在其他使用語法type(variable)int(100.0004)作爲示例實現相同演員的情況下,我已經看到(甚至使用過)代碼。

我只是好奇兩種方法之間的區別是什麼,以及是否有任何影響使用一個在另一個。

實施例:

double someDouble = 100.00456; 

// Cast the double using the (type)variable syntax 
int firstCastValue = (int)someDouble; 

// Cast the double using the type(variable) syntax 
int secondCastValue = int(someDouble); 
+4

你應該使用'static_cast'比任何這些! – 2012-01-16 14:12:13

+0

@GeorgFritzsche乾杯 - 在寫問題之前,我試着找到這樣的文章/ SO貼子。 – 2012-01-16 14:17:28

+1

你受到這樣一個事實的影響:('不是最簡單的字符搜索...:/ – 2012-01-16 14:55:09

回答

8

兩者是完全一樣的,並且這對於任何類型真。

就個人而言,我會避免第一種形式,(T)x,有利於明確的靜態鑄造:

y = static_cast<T>(x); 

這表示要x轉換爲類型T

第二種形式是相當令人回味的多一個構造函數調用的,而這有時最好:

v = std::vector<int>(10); // not: v = static_cast<std::vector<int>>(10) 

要重複,這兩種形式是完全等價的,這是你喜歡的口味的問題。如果這是有道理的,我會使用靜態轉換來「轉換」和構造器語法來「構建」。

+0

因此,一個調用'Foo(arg)',其中'Foo'是類類型可以調用默認構造函數,然後轉換運算符? – Kos 2012-01-16 14:13:14

+3

@Kos:只有兩個中的任何一個。'Foo'可以從'arg'構造,*或*'arg'有一個轉換運算符到'Foo'.如果兩個都定義了,那麼它是不明確的 – 2012-01-16 14:16:16

2

無。他們完全一樣。但是這是C++,你不應該在類型之間使用C風格的轉換。 static_cast<int>(someDouble)是你在找什麼。

+1

隱式轉換是可能的,沒有警告。'intvar = doublevar'比'intvar = static_cast (doublevar)'更優雅,因爲很明顯這是一個標準的轉換,而不是你必須強制的。 – 2012-01-16 14:19:35

+1

...與警告有一個奇怪的角色案例,C風格的演員是唯一可以工作的角色(轉換爲無法訪問的基類)。我還要補充說,避免演員(根本)比你使用的語法重要得多FO當你使用一個時,你可以選擇演員陣容。 – 2012-01-16 14:21:34

+0

@JerryCoffin你可以舉一個沒有任何C++類型轉換工作的例子嗎? – 2012-01-16 14:38:10

1

他們會做同樣的操作。然而,

  • (int)someDouble是C樣式轉換,這是在C++氣餒。不要使用它。永遠。
  • int(someDouble)語法不是強制轉換,它是一個明確的創建臨時請求。它允許使用多於1個參數創建臨時使用構造函數,並使用顯式構造函數創建臨時對象。另一方面,它不允許使用單一標識符來命名類型(所以沒有指針,不是unsigned long等)。通常在您的意圖是暫時使用一些類型的複雜類型時使用,即使用非平凡構造函數。
  • static_cast<int>(someDouble)是你真正應該使用的大部分時間。它將在任何可兌換類型之間以及僅在相關的類型之間進行投射。大部分時間你應該限制自己。

還有的*_cast其他口味,即:

  • dynamic_cast<Something *>(pAnything)將檢查在運行時指針實際上指向指定類型,並返回NULL,如果它不。也可用於像dynamic_cast<Something &>(anything)這樣的引用,在這種情況下,如果它不是正確的類型,則會拋出std::bad_cast異常。這就像C#anything as Something
  • const_cast<Something *>(constSomething)只能刪除const限定符;其他*_cast將拒絕。如果你需要這個,你有設計問題。
  • reinterpret_cast<Something *>(pUnrelated)會投出不相關的指針。由於在C++中,一個指針轉換不一定是一個簡單的操作(爲繼承乘的對象添加/減去偏移量),這通常是一個壞主意,應該只在巧妙地使用時才使用。實際上,我不確定是否有使用reinterpret_cast不會違反「嚴格別名規則」,因此是平臺相關的。 C風格演員在指針不相關時衰減重新解釋演員的原因是爲什麼它不應該被使用。
+0

@JerryCoffin:由於所有引入其他演員風格的原因,他們不被該標準所棄用,而是被許多編碼指南所棄用。說「灰心」可能會更好;編輯。 – 2012-01-16 15:10:07