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
static_cast
ilk 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_cast
ya 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_cast
neredeyse 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_cast
en 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_cast
olamaz 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.
Parantez ve parantez, Scala, resmi ara...
Java mı anahtar kelime iddia, ne yapar...
Bir boşluk döküm static_cast veya rein...
Reinterpret_cast ne zaman kullanılır?...
Farklılıklar arasında .yapı, .oluşturu...