SORU
1 Aralık 2008, PAZARTESİ


Ne zaman static_cast, dynamic_cast, const_cast reinterpret_cast ve kullanılmalıdır?

Ne doğru kullanır

  • static_cast
  • dynamic_cast
  • const_cast
  • reinterpret_cast
  • C-stil (type)value dökme
  • Fonksiyon tarzı type(value) dökme

Nasıl bir belirli durumlarda kullanmak için hangi karar?

CEVAP
1 Aralık 2008, PAZARTESİ


static_castilk atama kullanmak için çalışmalıdır. Yaptığı şeyler gibi örtülü dönüşüm arasında türleri (gibi int float veya işaretçi void*), ve aynı zamanda arama açık dönüştürme fonksiyonları (veya örtülü olanlar). Birçok durumda, açıkça belirten static_cast gerek yok, ama önemli not T(something) sözdizimi eşdeğerdir (T)something ve kaçınılmalıdır (daha o daha sonra). T(something, something_else) güvenli olduğunu, ancak, ve kurucusunu çağırmak için garantili.

static_cast da kalıtım hiyerarşileri ile çevirebilirsiniz. Yukarı (temel sınıf karşı) döküm gereksiz, ama aşağı çevrim virtual miras yoluyla dökme değil sürece kullanılabilir. Kontrol yapmaz, ancak ve tanımsız davranış 16 ** aslında nesne türü değil, bir türü için bir hiyerarşi var.


const_castya da bir değişkene const kaldırmak için kullanılabilir; diğer C kadrosu kaldırma kapasitesine (reinterpret_cast bile). ÖNEMLİ NOT değiştirme, eskiden const değeri sadece tanımsız eğer orijinal değişkendir const; eğer kullanmak için const kapalı bir başvuru için bir şey olmadığını ilan etti const, güvenli. Bu örnek için üye fonksiyonları const dayalı aşırı yararlı olabilir. Ayrıca, bir nesne, bir üye aşırı fonksiyonu çağırmak gibi const eklemek için kullanılabilir.

const_cast ayrıca daha az yaygın olsa da benzer şekilde volatile üzerinde çalışır.


dynamic_castneredeyse sadece polimorfizmi işlemek için kullanılır. Başka bir sınıf türü (polimorfik bir tür en az bir sanal işlevi, ilan ya da devralmıştır) için herhangi bir polimorfik türü için bir işaretçi veya başvuru çevirebilirsiniz. Sadece daha aşağı yan ya da başka bir zincir Yukarı çevirebilirsiniz döküm için kullanabilirsiniz. dynamic_cast mümkünse istenen nesneyi bulmak ve onu bulur. Eğer bir işaretçi durumda NULL döner mi, olabilir, ya da bir referans olması durumunda std::bad_cast atmak.

dynamic_cast bazı sınırlamalar vardır. Eğer devralma hiyerarşisinde aynı türden birden fazla nesne varsa orada çalışmıyor (sözde 'korkunç diamond') ve virtual miras yok. Ayrıca, sadece kamu devralma yoluyla gitmek için, her zaman protected private miras seyahat için başarısız olur. Bu miras, bu tür seyrek olarak, nadiren bir sorun, ancak,.


reinterpret_casten tehlikeli oyuncular var, ve çok tedbirli bir şekilde kullanılmalıdır. Doğrudan başka - başka bir işaretçi değeri döküm, veya int veya diğer kötü şeyler bir bir işaretçi depolamak gibi bir tip çıktı. Büyük ölçüde, reinterpret_cast ile tek garanti normalde eğer sonuç özgün bir tür döküm, tam olarak aynı değeri alacak (amadeğileğer Ara tipi orijinal tip) daha küçük ise. Orada Dönüşümleri Bir dizi bureinterpret_castolamaz da. Öncelikle uyumlu bir işaretçi Düşük bit gerçek veri ham veri akışı veya veri depolama dönüm gibi özellikle garip dönüşümler ve bit uygulamaları için kullanılır.


C atmalarını(type)object type(object) kullanarak çevirir. C-style cast başarılı olan şu: ilk olarak tanımlanmaktadır

  • const_cast
  • static_cast (gerçi erişim kısıtlamaları göz ardı ediliyor)
  • static_cast (bakınız), const_cast
  • reinterpret_cast
  • reinterpret_cast const_cast

Olabilir, bu gibi durumlarda kullanılan bir yedek için diğer yayınları bazı durumlarda, ama olabilir son derece tehlikeli çünkü yeteneği için alışılmış bir reinterpret_cast ve ikincisi tercih edilmelidir zaman açık çevrim gerekli olmadığı sürece emin static_cast başarılı veya reinterpret_cast başarısız olacaktır. O zaman bile, daha açık, artık bu seçeneği göz önünde bulundurun.

C-stil de bir sahne başka artığını bir işlemi gerçekleştirmek için yeteneği anlamına gelir static_cast, erişim kontrol görmezden çevirir. Bu daha çok çakma olmasına rağmen aklımda sadece bir C-tarzı atmalarını engellemek için bir sebep.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • paikimchung

    paikimchung

    12 Mayıs 2006
  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011
  • WestsideMrArO

    WestsideMrAr

    6 EKİM 2010