Bunu üç dille etiketlediniz ve üçü arasında cevaplar gerçekten oldukça farklı. C ++ 'ın tartışılması aşağı yukarı C dökümlerinin tartışılması anlamına gelir ve bu (aşağı yukarı) dördüncü bir cevap verir.
Açıkça bahsetmediğin olduğundan, C ile başlayacağım. C yayınlarının bir takım sorunları var. Birincisi, birçok farklı şeyi yapabilmeleridir. Bazı durumlarda, cast derleyiciye şunu söylemekten başka bir şey yapmaz (özünde): "Kapa çeneni, ne yaptığımı biliyorum" - yani sorunlara neden olabilecek bir dönüştürme yaptığınızda bile derleyicinin sizi bu potansiyel sorunlar hakkında uyarmayacaktır. Sadece örneğin char a=(char)123456;
. Bu uygulamanın kesin sonucu tanımlanmıştır (boyutuna ve imzasına bağlıdır.char
) ve oldukça garip durumlar haricinde, muhtemelen yararlı değildir. C yayınları, yalnızca derleme zamanında gerçekleşen bir şey olup olmadıklarına (yani derleyiciye yalnızca bazı verileri nasıl yorumlayacağını / işleyeceğini söylüyorsunuz) veya çalışma zamanında gerçekleşen bir şey olup olmadığına (örneğin, ikiye kattan uzun).
C ++, her biri bir C dökümünün yeteneklerinin sadece bir alt kümesiyle sınırlı olan bir dizi "yeni" döküm operatörü ekleyerek en azından bir dereceye kadar bununla başa çıkmaya çalışır. Bu, (örneğin) gerçekten istemediğiniz bir dönüşümü yanlışlıkla yapmayı zorlaştırır - eğer sadece bir nesneye sadakati atmak istiyorsanız, kullanabilirsiniz const_cast
ve bunun etkileyebileceği tek şeyin olup olmadığına emin olun. bir amacı const
, volatile
, ya da. Bunun tersine, bir static_cast
amacı, etkili olup izin verilmez const
veyavolatile
. Kısacası, aynı tür yeteneklerin çoğuna sahipsiniz, ancak bunlar kategorize edildiğinden, bir oyuncu genellikle yalnızca bir tür dönüştürme yapabilir, burada tek bir C-stili kadro, bir işlemde iki veya üç dönüştürme yapabilir. Birincil istisna olmasıdır olabilir bir kullanmak dynamic_cast
bir yerine static_cast
en azından bazı durumlarda ve şeklinde yazılır rağmen dynamic_cast
, gerçekten olarak bitireceğiz static_cast
. Örneğin, dynamic_cast
bir sınıf hiyerarşisini yukarı veya aşağı hareket ettirmek için kullanabilirsiniz - ancak hiyerarşiyi "yukarı" çevirmek her zaman güvenlidir, bu nedenle statik olarak yapılabilir, ancak hiyerarşiyi "aşağı" çevirmek her zaman güvenli değildir, bu nedenle dinamik olarak yapılır.
Java ve C # birbirine çok daha benzer. Özellikle, her ikisinde de döküm (neredeyse?) Her zaman bir çalışma zamanı işlemidir. C ++ döküm operatörleri dynamic_cast
açısından, gerçekte ne yapıldığına göre genellikle a'ya en yakın olanıdır - yani, bir nesneyi bir hedef türüne atmaya çalıştığınızda, derleyici bu dönüşüme izin verilip verilmediğini görmek için bir çalışma zamanı kontrolü ekler. ve değilse bir istisna atın. Kesin ayrıntılar (örneğin, "kötü dönüştürme" istisnası için kullanılan ad) değişiklik gösterir, ancak temel ilke çoğunlukla benzer kalır (ancak, bellek hizmet veriyorsa, Java, int
C'ye çok daha yakın gibi birkaç nesne olmayan türe uygulanmış yayınlar yapar. yayınlar - ancak bu türler yeterince nadir kullanılır ki 1) Bunu kesin olarak hatırlamıyorum ve 2) doğru olsa bile, zaten pek bir önemi yok).
Her şeye daha genel bakıldığında, durum oldukça basittir (en azından IMO): bir oyuncu kadrosu (açıkça yeterli), bir şeyi bir türden diğerine dönüştürdüğünüz anlamına gelir. Bunu ne zaman / yaparsanız, "Neden?" Sorusunu gündeme getirir. Bir şeyin gerçekten belirli bir tür olmasını istiyorsanız, neden onu başlangıçta bu tür olarak tanımlamadınız? Bu , böyle bir dönüştürme yapmak için hiçbir zaman bir neden olmadığı anlamına gelmez, ancak bu ne zaman olursa olsun, baştan sona doğru türün kullanılması için kodu yeniden tasarlayıp tasarlayamayacağınız sorusunu sormalıdır. Görünüşte zararsız dönüşümler bile (örneğin, tam sayı ve kayan nokta arasındaki) yaygın olandan çok daha yakından incelenmelidir. Görünüşlerine rağmenbenzerlik, tamsayılar "sayılan" türdeki şeyler için ve "ölçülen" türdeki şeyler için kayan nokta kullanılmalıdır. Ayrımı göz ardı etmek, "ortalama bir Amerikan ailesinin 1.8 çocuğu var" gibi bazı çılgın ifadelere yol açan şeydir. Bunun nasıl olduğunu hepimiz görebiliyor olsak da, gerçek şu ki hiçbir ailenin 1.8 çocuğu yok. 1 veya 2 olabilir veya daha fazlasına sahip olabilirler - ama asla 1.8.