it-swarm.asia

c tarzı atma veya c ++ tarzı atma

Peki, ne kullanıyorsun?

int anInt = (int)aFloat;

veya

int anInt = static_cast<int>(aFloat);
// and its brethren

Ve daha da önemlisi, neden?

21
bastibe

İlk olarak, bu satırların eşdeğer olmadığını anlayın.

int* anInt = (int*)aFloat; // is equivalent to

int* anInt = reinterpret_cast<int*>(aFloat); 

Burada olan şey, programcının derleyiciden döküm yapmak için elinden geleni yapmasını istemesidir.

Fark önemlidir çünkü static_cast sadece dönüştürmek için "güvenli" bir taban türü isteyecektir, burada reinterpret_cast herhangi bir şeye dönüşecektir, muhtemelen sadece istenen nesnenin hafızası üzerinde istenen hafıza düzenini eşleyerek.

Dolayısıyla, "filtre" aynı olmadığından, belirli bir döküm kullanmak C dökümünü kullanmaktan daha açık ve güvenlidir, derleyiciye (veya dynamic_cast kullanıyorsanız çalışma zamanı impl.) Güvenirseniz, nerede yanlış bir şey yaptığınızı size söyler , avong C döküm ve reinterepret_cast ile.

Artık bu daha açık, başka bir şey daha var: static_cast, reinterpret_cast, const_cast ve dynamic_cast araması daha kolaydır .

Ve nihai nokta: onlar çirkin . Bu aranıyor. Potansiyel olarak buggy kodu, kod kokuları, hatalara neden olabilecek bariz "hileler", çirkin görünümle ilişkilendirildiğinde izlenmesi daha kolaydır. Bozuk kod çirkin olmalı .

Bu "tasarım gereği" dir. Ve geliştiricinin işleri daha iyi nerede yapabileceğini bilmesini sağlar (gerçekten gerekli değilse, dökümlerden tamamen kaçınarak) ve iyi ama çirkin olarak "işaretleyerek" kodda "belgelenmiştir".

Yeni stil kadrosunu tanıtmanın ikincil bir nedeni, C tarzı dökümlerin bir programda fark edilmesinin çok zor olmasıydı. Örneğin, sıradan bir düzenleyici veya Word işlemci kullanarak yayınları kolayca arayamazsınız. C tipi dökümlerin bu görünmezliği özellikle talihsizdir çünkü potansiyel olarak zararlıdırlar. Çirkin bir işlemin çirkin sözdizimsel bir formu olmalıdır. Bu gözlem, yeni tarz dökümler için sözdizimini seçme nedeninin bir parçasıydı. Başka bir neden, yeni stil dökümlerin şablon gösterimi ile eşleşmesiydi, böylece programcılar kendi dökümlerini, özellikle çalışma zamanı kontrol edilen dökümlerini yazabilirler.

Belki, static_cast yazması çok çirkin ve göreceli olarak zor olduğundan, birini kullanmadan önce iki kez düşünmeniz daha olasıdır? Bu iyi olurdu, çünkü dökümler gerçekten modern C++ 'da önlenebilir.

Kaynak: Bjarne Stroustrup (C++ yaratıcısı)

47
Klaim

C++ yayınları daha kısıtlayıcıdır (bu nedenle niyetinizi daha iyi ifade edin ve kod incelemesini kolaylaştırın vb.). İhtiyacınız olursa aramak da çok daha kolay.

37
Bruce Stephens

Seçenek C: bir "C++ tarzı" döküm, çünkü bir yapıdan ayırt edilemez:

int anInt = int(aFloat);

ya da:

int anInt(aFloat);

Bunun yanı sıra, iyi anlaşılmış ilkelleri olan bu önemsiz vakalar dışında, C tarzı dökümler üzerinde x_cast <> s kullanmayı tercih ederim. Bunun üç nedeni vardır:

  • Programcının gerçekleştirmeye çalıştığı işlemi daha dar bir şekilde tanımlarlar.

  • C tarzı dökümlerin yapamayacağı eylemleri gerçekleştirebilirler (özellikle, birden fazla miras zincirinin dalları arasında çapraz geçiş yapabilen dynamic_cast <> durumunda).

  • Bunlar çirkin. Programcının tip sistemine karşı çalıştığını yüksek sesle ilan ederler. Bu durumda, iyi bir şeydir.

13
Kaz Dragon

C/C++ - tarzı döküm hakkında birkaç kural var:

  1. Bir sabitin kaldırılması her zaman bir const_cast Kullanmalıdır. Açık nedenlerden dolayı. Ne yazık ki, klavyenin uzanmasına ve programcının parmağını kırmasına neden olan bir sabitin kaldırılmasına ilişkin kuralım onaylanmadı.
  2. Programcıların metale giderken ulaştıkları bit manipülasyon tarzı parıltılardan herhangi biri reinterpret_cast Kullanmalıdır. Gerçekten C'nin sahip olmadığı türden bir döküm: bu tamsayı'nın bitlerinin aslında bir şamandıra biti gibi davran. Bu, (int)(*(int*)(&floatVar)) Gibi rahatsızlıklardan kaçınır.
  3. "dynamic_cast" Kelimelerini yazarsanız, polimorfik sınıf hiyerarşinizi ve tasarımınızı durdurup yeniden değerlendirin. Bu kelimeleri silene kadar sınıf hiyerarşinizin tasarımını yeniden değerlendirmeye devam edin.
  4. static_cast İle uğraşmayın.

# 4'ün ardındaki mantık basitçe bunun önemli olmamasıdır. Diğer kurallara uymayan koşullar ya açık ya da gerçekten düşük düzeydedir. İnt-to-float gibi basit türlerin iyi anlaşılmış bir dönüşümü için özel sözdizimi gerekmez. Ve eğer bir şeyin derin, çirkin bağırsaklarına düşerseniz, bir şeyin derin, çirkin bağırsaklarına düşersiniz. Dişler, pençeler ve ateşin hemen hemen onu vermiş olması nedeniyle "burada ejderhalar" olduğuna dikkat çekmeye gerek yoktur.

7
Nicol Bolas

C dilinde kod yazıyorsanız bir C döküm kullanın. C++ ile yazıyorsanız, bir C++ cast kullanın.

Çoğu döküm uygun tip güvenliği ihlal ederken, C++ olanlar daha kısıtlayıcıdır ve bu nedenle C dökümüyle olduğundan biraz daha az güvenli değildir.

Ben aşırı yük zorlamak olsa da (T *) NULL kullanarak birini tolere edebilir ...

7
CashCow

Yukarıdaki mesajlara göre C++ (statik) döküm pratikte biraz daha güvenlidir.

Farklı döküm türleri ve profesyonelleri ve eksileri hakkında daha fazla bilgi aramak akıllıca olabilir.

Neden daha çok arka plana sahip olmak için. .

http://en.wikipedia.org/wiki/Static_cast

http://en.wikipedia.org/wiki/Dynamic_cast

http://en.wikipedia.org/wiki/Reinterpret_cast

4
the JinX

Gerçekten hangi dilde çalıştığımıza bağlı, çünkü ne dediklerini biliyorsunuz: Roma'da Roman konuşuyor. Bu yüzden C programlıyorsam, C özelliklerini max için kullanmaya çalışıyorum, ancak C++ programlıyorsam devam edin ve bazı insanlar bu yaklaşımı sevmese bile max C++ özelliklerini kullanıyorum çünkü onlar kod "daha az taşınabilir" yapar, umurumda değil, ben C++ ve C++ programlama ve ben derlemek için tamamen C++ uyumlu bir derleyici gerekir, aksi takdirde farklı bir şey ile çalışacağını söylüyorlar ilk başta.

3
Coyote21

static_cast vb. şablonlarda kullanıldığında C stili kalıplarla ilgili sorunlar nedeniyle icat edildi. Bir şablon yazıyorsanız veya kodunuz daha sonra bir şablona dönüştürülebilirse, C++ stili dökümler kullanmak iyi bir fikirdir. Bunun nedeni, C++ stili ifadelerin daha iyi ifade etme amacı taşımasıdır, bu nedenle C stili dökümlerin yanlış bir şey yapacağı durumlarda beklenen sonuçları verecektir (şablon parametreleri olarak belirli türler verilir).

Bunun dışında, onlara ihtiyacı olan belirli bir sorun varsa C++ tarzı dökümleri kullan diyorum - dynamic_cast en yaygın olanıdır, ancak bu muhtemelen her gün bir şey değildir.

Başka bir şey ve C stili bir döküm biraz daha az dağınıklık ve okunabilirliğe yardımcı olabilir veya belki de okuyucunun bu döküm stiline ne kadar aşina olduğuna bağlı olmayabilir. Benim görüşüme göre çok önemli değil, çoğunlukla kişisel bir tercih şey, ancak bazı insanlar C stilini sevmiyorsa şaşırmayın.

Son not - eğer çok fazla oyuncuya ihtiyacınız varsa, bu çok önemli bir şey, muhtemelen yanlış bir şey yapıyorsunuz. Bazı durumlarda bunun istisnaları vardır, ancak çoğu üst düzey kodun çok sayıda (varsa) dökümüne ihtiyacı olmamalıdır.

3
Steve314