Anda telah menandai ini dengan tiga bahasa, dan jawabannya sangat berbeda di antara ketiganya. Diskusi tentang C ++ kurang lebih menyiratkan diskusi tentang pemeran C juga, dan itu memberikan (lebih atau kurang) jawaban keempat.
Karena itu yang tidak Anda sebutkan secara eksplisit, saya akan mulai dengan C. Pemain C memiliki sejumlah masalah. Pertama, mereka dapat melakukan salah satu dari sejumlah hal yang berbeda. Dalam beberapa kasus, cast tidak lebih dari memberitahu compiler (pada intinya): "diam, saya tahu apa yang saya lakukan" - yaitu, memastikan bahwa bahkan ketika Anda melakukan konversi yang dapat menyebabkan masalah, compiler tidak akan memperingatkan Anda tentang potensi masalah tersebut. Misalnya saja char a=(char)123456;,. Hasil pasti dari implementasi ini ditentukan (tergantung pada ukuran dan penandatangananchar), dan kecuali dalam situasi yang agak aneh, mungkin tidak berguna. Cast C juga bervariasi apakah itu sesuatu yang terjadi hanya pada waktu kompilasi (yaitu, Anda hanya memberi tahu kompiler cara menafsirkan / memperlakukan beberapa data) atau sesuatu yang terjadi pada waktu proses (misalnya, konversi aktual dari ganda menjadi panjang).
C ++ mencoba untuk menangani hal itu setidaknya sampai batas tertentu dengan menambahkan sejumlah operator cast "baru", yang masing-masing dibatasi hanya untuk sebagian dari kemampuan cast C. Hal ini membuat lebih sulit untuk (misalnya) secara tidak sengaja melakukan konversi yang sebenarnya tidak Anda inginkan - jika Anda hanya bermaksud membuang kekonstanan pada suatu objek, Anda dapat menggunakan const_cast, dan memastikan bahwa satu - satunya hal yang dapat dipengaruhi adalah apakah sebuah benda const, volatileatau tidak. Sebaliknya, a static_casttidak diperbolehkan untuk mempengaruhi apakah suatu objek adalah constatauvolatile. Singkatnya, Anda memiliki sebagian besar jenis kemampuan yang sama, tetapi kemampuan tersebut dikategorikan sehingga satu pemeran biasanya hanya dapat melakukan satu jenis konversi, di mana satu pemeran gaya C dapat melakukan dua atau tiga konversi dalam satu operasi. Pengecualian utamanya adalah Anda dapat menggunakan a dynamic_castsebagai pengganti a static_castsetidaknya dalam beberapa kasus dan meskipun ditulis sebagai a dynamic_cast, itu akan benar-benar berakhir sebagai a static_cast. Misalnya, Anda dapat menggunakan dynamic_castuntuk melintasi ke atas atau ke bawah hierarki kelas - tetapi cast "ke atas" hierarki selalu aman, sehingga dapat dilakukan secara statis, sementara cast "ke bawah" hierarki tidak selalu aman sehingga dilakukan secara dinamis.
Java dan C # jauh lebih mirip satu sama lain. Secara khusus, dengan keduanya, casting selalu merupakan operasi run-time. Dalam hal operator cast C ++, biasanya ini paling dekat dengan a dynamic_castdalam hal apa yang sebenarnya dilakukan - yaitu, ketika Anda mencoba mentransmisikan objek ke beberapa jenis target, kompilator memasukkan pemeriksaan waktu proses untuk melihat apakah konversi itu diizinkan , dan berikan pengecualian jika tidak. Detail pastinya (misalnya, nama yang digunakan untuk pengecualian "cast buruk") bervariasi, tetapi prinsip dasarnya sebagian besar tetap serupa (meskipun, jika memori berfungsi, Java membuat cast diterapkan ke beberapa jenis non-objek seperti yang intlebih mirip dengan C gips - tetapi jenis ini cukup jarang digunakan sehingga 1) Saya tidak ingat pasti, dan 2) bahkan jika itu benar, itu tidak terlalu penting).
Melihat hal-hal secara lebih umum, situasinya cukup sederhana (setidaknya IMO): pemeran (cukup jelas) berarti Anda mengubah sesuatu dari satu jenis ke jenis lainnya. Kapan / jika Anda melakukan itu, itu menimbulkan pertanyaan "Mengapa?" Jika Anda benar-benar ingin sesuatu menjadi tipe tertentu, mengapa Anda tidak mendefinisikannya sebagai tipe itu? Itu tidak berarti tidak pernah ada alasan untuk melakukan konversi seperti itu, tetapi kapan pun itu terjadi, itu akan memunculkan pertanyaan apakah Anda dapat mendesain ulang kode sehingga tipe yang benar digunakan seluruhnya. Bahkan konversi yang tampaknya tidak berbahaya (misalnya, antara integer dan floating point) harus diperiksa lebih dekat daripada yang umum. Meskipun mereka terlihatkesamaan, bilangan bulat harus benar-benar digunakan untuk jenis hal yang "dihitung" dan titik mengambang untuk jenis hal yang "diukur". Mengabaikan perbedaan inilah yang menyebabkan beberapa pernyataan gila seperti "rata-rata keluarga Amerika memiliki 1,8 anak." Meskipun kita semua bisa melihat bagaimana itu terjadi, faktanya tidak ada keluarga yang memiliki 1,8 anak. Mereka mungkin memiliki 1 atau mungkin 2 atau mereka mungkin memiliki lebih dari itu - tetapi tidak pernah 1,8.