2012-09-19 48 views
0

我對C++非常陌生。目前我正在審查一個源代碼,我看到了一些類型轉換,但我不明白。
這是代碼。TypeCasting結構和類

struct str { 
    char *a; 
    int b; 
}; 

class F { 
public: 
    char* val; 
}; 

F f1; 

任何人都可以解釋下面的Assignement Please.or是類型轉換有效嗎?

str* ptr = (str*) f1->val; 
+0

可能不是,可能是的。不能沒有更多的信息。 – Mehrdad

+4

如果你對C++很陌生,你不應該混淆類型轉換。特別是這個,看起來很虛僞。 –

+1

你只是將char *轉換爲str *,它在理論上或實踐中都是無效的,因爲ptr-> b將指向F之外的某個未知內存空間。 – akhisp

回答

3

誰能解釋以下Assignement請。

它的意思是「假裝val指針指向str類型的對象,即使它宣佈指向一個完全不同類型的char;給我指針和信任,我知道我在做什麼」 。

這是假設真實代碼要麼聲明F * f1;,要麼將其作爲f1.val訪問;您發佈的代碼將無法編譯。

或者是類型轉換有效?

如果指針確實指向正確類型的對象,那麼它是有效的;否則,使用指針會導致程序以各種災難性的方式失敗。

類型轉換是應該很少有必要的。如果你真的需要它,你絕對不應該(在任何情況下絕對不會)使用C風格的演員;它意味着「只要有辦法做到這一點,即使它絕對沒有意義,也不要強迫轉換,不要進行任何檢查。」當你可以的時候使用static_castdynamic_cast,當你做的事情真的很狡猾時,使用reinterpret_castconst_cast。除非你知道你在做什麼,否則不要使用它們,並且有一個很好的理由來規避類型系統。

+0

請注意,對於標準佈局類,可以將指向對象的指針安全地轉換爲指向第一個成員的指針。 –

+0

@KerrekSB:的確如此,但這不是發生在這裏的事情。 –

+0

哦,對不起 - 如果'str :: a'是'char',那麼這個評論會更有意義。沒關係。 –