我對C++非常陌生。目前我正在審查一個源代碼,我看到了一些類型轉換,但我不明白。
這是代碼。TypeCasting結構和類
struct str {
char *a;
int b;
};
class F {
public:
char* val;
};
F f1;
任何人都可以解釋下面的Assignement Please.or是類型轉換有效嗎?
str* ptr = (str*) f1->val;
我對C++非常陌生。目前我正在審查一個源代碼,我看到了一些類型轉換,但我不明白。
這是代碼。TypeCasting結構和類
struct str {
char *a;
int b;
};
class F {
public:
char* val;
};
F f1;
任何人都可以解釋下面的Assignement Please.or是類型轉換有效嗎?
str* ptr = (str*) f1->val;
誰能解釋以下Assignement請。
它的意思是「假裝val
指針指向str
類型的對象,即使它宣佈指向一個完全不同類型的char
;給我指針和信任,我知道我在做什麼」 。
這是假設真實代碼要麼聲明F * f1;
,要麼將其作爲f1.val
訪問;您發佈的代碼將無法編譯。
或者是類型轉換有效?
如果指針確實指向正確類型的對象,那麼它是有效的;否則,使用指針會導致程序以各種災難性的方式失敗。
類型轉換是應該很少有必要的。如果你真的需要它,你絕對不應該(在任何情況下絕對不會)使用C風格的演員;它意味着「只要有辦法做到這一點,即使它絕對沒有意義,也不要強迫轉換,不要進行任何檢查。」當你可以的時候使用static_cast
或dynamic_cast
,當你做的事情真的很狡猾時,使用reinterpret_cast
或const_cast
。除非你知道你在做什麼,否則不要使用它們,並且有一個很好的理由來規避類型系統。
請注意,對於標準佈局類,可以將指向對象的指針安全地轉換爲指向第一個成員的指針。 –
@KerrekSB:的確如此,但這不是發生在這裏的事情。 –
哦,對不起 - 如果'str :: a'是'char',那麼這個評論會更有意義。沒關係。 –
可能不是,可能是的。不能沒有更多的信息。 – Mehrdad
如果你對C++很陌生,你不應該混淆類型轉換。特別是這個,看起來很虛僞。 –
你只是將char *轉換爲str *,它在理論上或實踐中都是無效的,因爲ptr-> b將指向F之外的某個未知內存空間。 – akhisp