Static_cast <> ve C stili döküm arasındaki fark nedir?


Yanıtlar:


217

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.


67
Çalışma zamanında başarısız olabilecek tek oyuncular dynamic_casts'dir.
R. Martinho Fernandes

12
C ++ reinterpret_cast <T> (U), çalışma zamanında C stili dökümlerin yaptığı gibi başarısız olabilir ve hepsi dynamic_cast <T> (U) 'un başarısız olmasından oldukça farklıdır.
Christopher Smith

20
˗1 normal C yayın (int)somethingbaşarısız olamaz - ya int ya da derleyici hatası alırsınız.
Tomáš Zato - Monica

2
C ++ yayınlarının neden C yayınlarından daha kolay aranabileceğini ayrıntılı olarak açıklayabilir misiniz?
Minh Tran

3
@ MinhTran C ++ stili için kaynak dosyalarınız aracılığıyla "cast" anahtar sözcüğünü arayabilirsiniz. Peki c tarzı atmalarla yapmak ister misin?
huangzonghao

176

Kısacası :

  1. static_cast<>() size derleme zamanı kontrol yeteneği verir, C-Style cast yapmaz.
  2. static_cast<>() daha okunabilir ve C ++ kaynak kodu içinde herhangi bir yere kolayca tespit edilebilir, C_Style cast is'nt.
  3. Niyetler C ++ dökümleri kullanılarak çok daha iyi aktarılır.

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


17
Sanırım "4 bayt işaretçi" demek istediğin "4 bayt veri
tipine

ancak int q = static_cast <int> (c) 'ye izin verir;
TonyParker

3
@TonyParker Çünkü bu satırda yanlış bir şey yok.
Braden Best

15

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.


14
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!
}

5
Verdiğiniz çözüm hakkında biraz daha açıklama ekleyerek cevabınızı biraz daha açıklayabilir misiniz?
abarisone

1
Ben cevap "static_casts" hiyerarşi grafiğinde geçerli yollar boyunca emin olmak için tür dönüşümleri denetler düşünüyorum. Bu özel örnekte, A ve B hiyerarşik grafikte bir yol oluşturduğundan A * 'dan B * veya B *' ya A * 'ya dökmeye izin verilir. C * yolda değil, bu nedenle static_cast derleme zamanı hatası oluşturur. Sidenote: A * 'dan B *' ye yayınlamanın, gerçek alttaki nesneye bağlı olarak çalışma zamanında bir dynamic_cast ile NULL ile sonuçlanabileceğini belirtmek gerekir.
Tommy Chen

7

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)

  1. const_cast
  2. static_cast
  3. static_cast ardından const_cast
  4. reinterpret_cast
  5. const_cast tarafından takip edilen reinterpret_cast

5

static_castderleme 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_castdö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_castdö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.


3

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?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.