Yanıtlar:
C ++ stili dökümler derleyici tarafından kontrol edilir. C stili yayınlar çalışma zamanında değildir ve başarısız olabilir.
Ayrıca, c ++ stil dökümleri kolayca aranabilir, oysa c stili dökümleri aramak gerçekten zordur.
Bir diğer büyük fayda, 4 farklı C ++ stilinin programcının amacını daha net ifade etmesidir.
C ++ yazarken hemen hemen her zaman C stili olan C ++ olanlarını kullanırdım.
dynamic_cast
s'dir.
(int)something
başarısız olamaz - ya int ya da derleyici hatası alırsınız.
Kısacası :
static_cast<>()
size derleme zamanı kontrol yeteneği verir, C-Style cast yapmaz.static_cast<>()
daha okunabilir ve C ++ kaynak kodu içinde herhangi bir yere kolayca tespit edilebilir, C_Style cast is'nt.Daha Fazla Açıklama :
Statik yayın uyumlu türler arasında dönüşüm gerçekleştirir . C tarzı oyuncuya benzer, ancak daha kısıtlayıcıdır. Örneğin, C stili kadro, bir tamsayı işaretçisinin bir karakteri göstermesini sağlar.
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
Bu, 1 baytlık ayrılmış belleğe işaret eden 4 baytlık bir işaretçi (4 baytlık veri tipine işaretçi) ile sonuçlandığından, bu işaretçiye yazmak bir çalışma zamanı hatasına neden olur veya bitişikteki bazı belleğin üzerine yazar.
*p = 5; // run-time error: stack corruption
C stili dökümün aksine, statik döküm derleyicinin işaretçi ve nokta veri türlerinin uyumlu olup olmadığını kontrol etmesine izin verir, bu da programcının derleme sırasında bu yanlış işaretçi atamasını yakalamasını sağlar.
int *q = static_cast<int*>(&c); // compile-time error
Ayrıca C ++ yayınları hakkında daha fazla açıklama için bu sayfayı kontrol edebilirsiniz: Buraya Tıklayın
Bkz . C ++ döküm operatörlerinin karşılaştırması .
Bununla birlikte, çeşitli farklı döküm işlemleri için aynı sözdiziminin kullanılması, programlayıcının amacını netleştirebilir.
Ayrıca, büyük bir kod tabanında belirli bir tür döküm bulmak zor olabilir.
C tarzı oyuncu kadrosunun genelliği, gereken tek şeyin basit bir dönüşüm olduğu durumlarda aşırıya kaçabilir. Farklı güç derecelerine sahip birkaç farklı döküm operatörü arasında seçim yapabilmek, programcıların yanlışlıkla yanlış tipte döküm yapmasını önleyebilir.
struct A {};
struct B : A {};
struct C {};
int main()
{
A* a = new A;
int i = 10;
a = (A*) (&i); // NO ERROR! FAIL!
//a = static_cast<A*>(&i); ERROR! SMART!
A* b = new B;
B* b2 = static_cast<B*>(b); // NO ERROR! SMART!
C* c = (C*)(b); // NO ERROR! FAIL!
//C* c = static_cast<C*>(b); ERROR! SMART!
}
C / C ++ 'daki farklı yayınları ve C stili oyuncuların gerçekte ne yaptığını açıklayan harika bir gönderi: https://anteru.net/blog/2007/12/18/200/index.html
C-tipi döküm, (type) değişken sözdizimini kullanarak. En kötüsü icat edildi. Bu işlem şu sırayla şu sırayı yapmaya çalışır: (ayrıca bkz. C ++ Standardı, 5.4 expr.cast paragraf 5)
- const_cast
- static_cast
- static_cast ardından const_cast
- reinterpret_cast
- const_cast tarafından takip edilen reinterpret_cast
static_cast
derleme zamanında dönüşümün açıkça uyumsuz türler arasında olmadığını kontrol eder. Aksine dynamic_cast
, çalışma zamanında tip uyumluluğu için kontrol yapılmaz. Ayrıca, static_cast
dönüşüm mutlaka güvenli değildir.
static_cast
işaretçiden taban sınıfına işaretçi türetilmiş sınıfa veya enum to int veya float to int gibi yerel türler arasında dönüştürmek için kullanılır.
Kullanıcısının static_cast
dönüşümün güvenli olduğundan emin olması gerekir.
C tarzı döküm, derleme sırasında veya çalışma zamanında herhangi bir denetim gerçekleştirmez.
Her biri farklı semantiğe sahip birçok farklı döküm türü olduğundan, static_cast <> "int'ten double'a" bir türden diğerine yasal bir dönüşüm yapıyorum "demenizi sağlar. Sade C tarzı bir oyuncu seçimi çok şey ifade edebilir. Yukarı / aşağı döküm yapıyor musunuz? İşaretçiyi yeniden mi yorumluyorsunuz?