C , neden (int)yerine static_cast<int>(x) x kullanmak?
C static_cast
işlevi C-tarzı ya da sade tercih edilmesi gerektiğini duydum işlev tarzı döküm. Bu doğru mu? Neden?
CEVAP
Ana nedeni klasik C dediğimiz şey arasında hiçbir ayrımstatic_cast<>()
, reinterpret_cast<>()
, const_cast<>()
, ve dynamic_cast<>()
hale çevirir. Bu dört şey tamamen farklıdır.
static_cast<>()
genelde güvenlidir. Dilinde geçerli bir dönüşüm, ya da bunu mümkün kılan uygun bir kurucusu yoktur. Sadece zamanı biraz riskli olduğu zaman sizi aşağı atmak için bir miras sınıf; emin olmanız gerekir nesnedir aslında soyundan olduğunu iddia ediyorsun, demek harici dil (bayrak gibi bir nesne). dynamic_cast<>()
güvenli bir sonuç işaretli olduğu sürece (işaretçi) veya olası bir durum dikkate (referans) alınır.
Diğer yandan reinterpret_cast<>()
(const_cast<>()
) her zaman tehlikelidir. Derleyici söyle: "inan bana, bu foo
(bu değişken değil ise değil gibi görünüyor) gibi görünmediğini biliyorum, ama".
İlk sorunun neredeyse imkansız bir kod büyük ve dağınık parçaları bakmak ve tüm kuralları bilmeden C-tarzı bir döküm içinde oluşacak olan belli değil.
Hadi bu varsayalım:
class CMyClass : public CMyBase {...};
class CMyOtherStuff {...} ;
CMyBase *pSomething; // filled somewhere
Şimdi, bu ikisi aynı şekilde derlenir:
CMyClass *pMyObject;
pMyObject = static_cast<CMyClass*>(pSomething); // Safe; as long as we checked
pMyObject = (CMyClass*)(pSomething); // Same as static_cast<>
// Safe; as long as we checked
// but harder to read
Ancak, diyelim ki bu hemen hemen aynı kod bakın:
CMyOtherStuff *pOther;
pOther = static_cast<CMyOtherStuff*>(pSomething); // Compiler error: Can't convert
pOther = (CMyOtherStuff*)(pSomething); // No compiler error.
// Same as reinterpret_cast<>
// and it's wrong!!!
Gördüğünüz gibi, tüm derslerin yer hakkında çok şey bilmeden, iki durum arasında ayrım yapmak için kolay bir yolu yoktur.
İkinci sorun C-stil atmalarını bulmak çok zor olmasıdır. Karmaşık ifadeleri C-tarzı görmek çok zor olabilir atmalarını. Neredeyse imkansız C-stil atmalarını (örneğin bir arama aracı) tam gaz C compiler olmadan ön uç bulmak için gereken otomatik bir araç yazmak için. Öte yandan, kolay aramak için "static_cast<" veya "reinterpret_cast<".
pOther = reinterpret_cast<CMyOtherStuff*>(pSomething);
// No compiler error.
// but the presence of a reinterpret_cast<> is
// like a Siren with Red Flashing Lights in your code.
// The mere typing of it should cause you to feel VERY uncomfortable.
Sadece C-tarzı anlamına gelir daha tehlikeli atmalarını, ama çok onları doğru olduklarından emin olmak için tüm bunları bulmak zordur.
Neden nesne yerine bir işaretçi kendis...
Neden yerine argparse optparse kullanm...
Neden dizi indis yerine kullanımına ku...
Neden DOM sadece <script> bir öğ...
Neden tanım listeleri (DD DL,DT) tablo...