2011-01-23 16 views

cevap

2

. Bu bir tercih meselesi. Bunlar eski tarzdaki dökümlerdir

+5

-1 Bu yanlış bir bilgidir. – Omnifarious

+0

@Charles Bailey - Bir hata yaptım. Düzeltmek için artık çok geç. Üzgünüm @ user384706. – Omnifarious

3

Hiç bir fark yoktur. Resmi olarak, ilk derleyiciye değerin bir tamsayı olduğunu söyler. Bu muhtemelen herhangi bir ekstra kod oluşturmaz. İşlev çağrısı, diğer typecast'i dahili olarak gerçekleştiren gerçek bir çağrıdır. Akıllı bir derleyici bunu optimize eder, böylece aslında aynıdır.

5

Görünüşe göre ilk kesimimde bir cevapta yanılmışım. Onlar kabaca eşdeğerdir. long long veya void * gibi bileşik türü adları (yani long long(val) çalışmıyor) doğrudan işlevsel sözdizimi kullanamazsınız ederken, typedef kullanarak bu soruna alabilirsiniz.

Her iki döküm işareti de çok kötü ve kaçınılmalıdır. Örneğin,

çalışır ve yapılmamalıdır.

İkisi C tarzı döküm notasyonu bazen bazen reinterpret_cast gibi const_cast gibi bazen static_cast gibi davranır, ya da kullanılan tam o duruma göre iki hatta bir kombinasyon olacaktır. Bu semantikler oldukça karmaşıktır ve herhangi bir durumda neler olup bittiğini tam olarak söylemek her zaman kolay değildir.

Çoğunlukla C++ static_cast<type>(val) tarzı atmalarını kullanarak gitmiş ve asla C tarzı atmalarını kullanmak var. Bu soruya yaptığım araştırmaya dayanarak, her şey için işlev stili yayınları kullanmayı da bırakacağım. "C++ cast syntax styles" sorusu, bunun nedenini açıklayan mükemmel bir cevaba (kabul edilene) sahiptir.

+2

Bu tamamen yanlıştır. A sınıfı {operatör int() const; }; int sınaması (Aa) {return int (a); '' int' herhangi bir kurucuya sahip olmasa bile mükemmel çalışır. Tek bir parametreli bir işlev stili, eşdeğer C stili dökümle tam olarak aynı etkiye sahiptir. –

+0

@Charles Bailey - Daha fazla okudum ve yanlış olduğumu öğrendim. :-) Cevabımı düzelttim. – Omnifarious

+0

İşlevsel stil işaretçilerle yayınlandı: 'typedef void * voidp; ... Voidp fred = voidp (&c); ' –

1

Nerede ve nasıl kullandığınız bağlıdır. Yani değerleriniz veya işaretleriniz varsa (veya işaretçilerin göstergeleri). Eğer < _cast * üzerinde okumak> ve bunun yerine bunları kullanmak gerekir C++ ile

.