it-swarm-id.com

g gaya c atau g gaya c ++

Jadi, apa yang kamu gunakan?

int anInt = (int)aFloat;

atau

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

Dan, yang lebih penting, mengapa?

21
bastibe

Pertama, pahami bahwa garis-garis itu tidak setara .

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

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

Apa yang terjadi di sini adalah bahwa programmer meminta compiler untuk melakukan apa saja untuk membuat para pemain.

Perbedaannya penting karena menggunakan static_cast hanya akan meminta jenis basis yang "aman" untuk dikonversi, di mana reinterpret_cast akan dikonversi ke apa saja, mungkin dengan hanya memetakan tata letak memori yang diinginkan di atas memori objek yang diberikan.

Jadi, karena "filter" tidak sama, menggunakan gips spesifik lebih jelas dan aman daripada menggunakan gips C, jika Anda mengandalkan kompiler (atau runtime impl. Jika Anda menggunakan dynamic_cast) untuk memberi tahu Anda di mana Anda melakukan sesuatu yang salah , dengan menghindari C cast dan reinterepret_cast.

Sekarang ini lebih jelas, ada satu hal lagi: static_cast, reinterpret_cast, const_cast dan dynamic_cast lebih mudah untuk dicari .

Dan intinya: mereka jelek . Itu diinginkan. Kode berpotensi buggy, bau kode, "trik" jelas yang mungkin menghasilkan bug, lebih mudah dilacak ketika dikaitkan dengan tampilan yang jelek. Kode buruk harus jelek .

Itu "dengan desain". Dan itu memungkinkan pengembang tahu di mana ia bisa melakukan hal-hal yang lebih baik (dengan sepenuhnya menghindari gips, jika tidak benar-benar diperlukan) dan di mana itu baik-baik saja tetapi "didokumentasikan" dalam kode dengan "menandai" sebagai jelek.

Alasan kedua untuk memperkenalkan pemeran gaya baru adalah bahwa pemeran gaya-C sangat sulit dikenali dalam suatu program. Misalnya, Anda tidak dapat mencari gips dengan mudah menggunakan editor atau pengolah kata biasa. Gips gaya C yang hampir tidak terlihat ini sangat disayangkan karena berpotensi merusak. Operasi jelek harus memiliki bentuk sintaksis jelek. Pengamatan itu adalah bagian dari alasan untuk memilih sintaksis untuk gips gaya baru. Alasan selanjutnya adalah agar gips gaya baru cocok dengan notasi templat, sehingga pemrogram dapat menulis gips mereka sendiri, terutama gips yang diperiksa run-time.

Mungkin, karena static_cast sangat jelek dan relatif sulit untuk diketik, Anda lebih cenderung berpikir dua kali sebelum menggunakannya? Itu akan baik, karena para pemain benar-benar sebagian besar dapat dihindari dalam C++ modern.

Sumber: Bjarne Stroustrup (pembuat C++)

47
Klaim

C++ cast lebih terbatas (jadi ekspresikan maksud Anda lebih baik dan buat review kode lebih mudah, dll.). Mereka juga jauh lebih mudah untuk dicari, jika perlu.

37
Bruce Stephens

Opsi C: pemeran "C++ - style", karena tidak dapat dibedakan dari konstruksi:

int anInt = int(aFloat);

atau bahkan:

int anInt(aFloat);

Selain itu, selain dari kasus-kasus sepele dengan primitif ini, yang dipahami dengan baik, saya lebih suka menggunakan x_cast <> di atas cast-style C. Ada tiga alasan mengapa:

  • Mereka lebih sempit mendefinisikan operasi yang coba dilakukan oleh programmer.

  • Mereka dapat melakukan tindakan yang tidak dapat dilakukan oleh gaya-C (terutama dalam kasus dynamic_cast <>, yang dapat melakukan lintas silang di seluruh cabang rantai multi-warisan).

  • Mereka jelek. Mereka dengan keras menyatakan bahwa programmer bekerja melawan sistem tipe. Dalam hal ini, itu adalah hal yang baik .

13
Kaz Dragon

Saya punya beberapa aturan tentang C/C++ - style cast:

  1. Menonaktifkan penerapan konst harus selal menggunakan const_cast. Untuk alasan yang jelas. Sayangnya, aturan saya tentang dis-menerapkan const menyebabkan keyboard menjangkau dan mematahkan jari programmer tidak disetujui.
  2. Shenanigans gaya manipulasi bit mana pun yang harus diprogram oleh programmer saat turun ke logam harus menggunakan reinterpret_cast. Ini benar-benar jenis pemeran yang tidak dimiliki C: pura-pura bilangan bulat ini sebenarnya adalah bit pelampung. Ini menghindari ketidaknyamanan seperti (int)(*(int*)(&floatVar)).
  3. Jika Anda mengetik kata-kata "dynamic_cast ", hentikan dan evaluasi kembali hierarki dan desain kelas polimorfik Anda. Lanjutkan mengevaluasi kembali desain hierarki kelas Anda hingga Anda dapat menghapus kata-kata itu.
  4. Jangan repot-repot dengan static_cast.

Alasan di balik # 4 hanya karena itu tidak masalah. Keadaan yang tidak sesuai dengan aturan lain jelas atau benar-benar tingkat rendah. Konversi tipe-tipe sederhana yang dipahami dengan baik seperti int-to-float seharusnya tidak memerlukan sintaksis khusus. Dan jika Anda berada di dalam perut yang dalam, sesuatu yang buruk, yah, Anda berada di dalam perut yang dalam, sesuatu yang buruk. Tidak perlu untuk menarik perhatian pada kenyataan bahwa "di sini ada naga," karena gigi, cakar, dan api sudah cukup memberikannya.

7
Nicol Bolas

Jika menulis kode dalam C gunakan cast C. Jika menulis dalam C++ gunakan pemeran C++.

Sementara kebanyakan casting merusak keselamatan tipe yang tepat, yang C++ lebih ketat, dan oleh karena itu Anda sedikit kurang tipe-tidak aman daripada Anda akan dengan pemain C.

Saya dapat mentolerir seseorang menggunakan (T *) NULL meskipun untuk memaksa kelebihan ...

7
CashCow

Sebagai catatan di atas perhatikan para pemain C++ (statis) sedikit lebih aman dalam praktiknya.

Mungkin pintar untuk mencari lebih banyak informasi tentang berbagai jenis casting dan pro dan kontra mereka.

Hanya untuk memiliki lebih banyak alasan mengapa. .

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

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

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

4
the JinX

Itu benar-benar tergantung pada bahasa mana saya bekerja, karena Anda tahu apa yang mereka katakan: Di Roma berbicara bahasa Romawi. Jadi jika saya pemrograman dalam C, saya mencoba menggunakan fitur C ke max, tetapi jika saya pemrograman di C++ saya melanjutkan dan menggunakan fitur C++ ke max, bahkan jika beberapa orang tidak menyukai pendekatan itu karena mereka mengatakan itu membuat kode "kurang portabel", saya mengatakan bahwa saya tidak peduli, saya di C++ dan pemrograman di C++, dan saya memerlukan kompiler yang sepenuhnya kompatibel dengan C++ untuk mengkompilasi kode, kalau tidak saya akan bekerja dengan sesuatu yang berbeda di tempat pertama.

3
Coyote21

static_cast dll diciptakan karena masalah dengan cast gaya C ketika digunakan dalam template. Jika Anda menulis templat, atau jika kode Anda nanti dapat dikonversi menjadi templat, sebaiknya gunakan cetakan gaya C++. Alasannya adalah karena gaya C++-cast memberikan maksud mengekspresikan yang lebih baik, sehingga mereka akan memberikan hasil yang diharapkan dalam kasus-kasus di mana cast-style C akan melakukan hal yang salah (diberikan tipe tertentu sebagai parameter templat).

Selain itu, saya katakan menggunakan pemeran gaya C++ jika Anda memiliki masalah khusus yang membutuhkannya - dynamic_cast adalah yang paling umum, tetapi bahkan itu mungkin bukan hal yang biasa.

Ada hal lain, dan pemeran gaya C mungkin sedikit kurang berantakan dan membantu keterbacaan, atau mungkin tidak tergantung pada seberapa akrab pembaca dengan gaya pemeran saat ini. Itu tidak terlalu penting dalam pandangan saya, kebanyakan hal preferensi pribadi, meskipun jangan heran jika beberapa orang tidak menyukai gaya C.

Catatan akhir - jika Anda membutuhkan banyak pemain sehingga ini adalah masalah besar, Anda mungkin melakukan sesuatu yang salah. Ada pengecualian untuk itu dalam beberapa kasus, tetapi sebagian besar kode level tinggi seharusnya tidak membutuhkan banyak (jika ada) gips.

3
Steve314