SORU
19 EYLÜL 2008, Cuma


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
19 EYLÜL 2008, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Techmoan

    Techmoan

    31 Mayıs 2009
  • Crossover

    Crossover

    18 HAZİRAN 2007
  • Willie D.

    Willie D.

    16 Aralık 2006