Jawaban:
Gips gaya C ++ diperiksa oleh kompiler. Gips gaya C tidak dan dapat gagal saat runtime.
Juga, pemeran gaya c ++ dapat dicari dengan mudah, sedangkan sangat sulit untuk mencari pemeran gaya c.
Manfaat besar lainnya adalah bahwa 4 pemeran gaya C ++ berbeda mengekspresikan maksud programmer dengan lebih jelas.
Saat menulis C ++ saya hampir selalu menggunakan yang C ++ di atas gaya C.
dynamic_cast
s.
(int)something
tidak dapat gagal - Anda mendapatkan cast ke int atau compiler error.
Singkatnya :
static_cast<>()
memberi Anda kemampuan memeriksa waktu kompilasi, pemeran C-Style tidak.static_cast<>()
lebih mudah dibaca dan dapat dilihat dengan mudah di mana saja di dalam kode sumber C ++, C_Style cast is'nt.Penjelasan Lebih Lanjut :
Para pemain statis melakukan konversi antara tipe-tipe yang kompatibel . Ini mirip dengan para pemeran C-style, tetapi lebih membatasi. Sebagai contoh, pemeran gaya-C akan memungkinkan pointer integer untuk menunjuk ke char.
char c = 10; // 1 byte
int *p = (int*)&c; // 4 bytes
Karena ini menghasilkan pointer 4-byte (pointer ke tipe data 4-byte) yang menunjuk ke 1 byte dari memori yang dialokasikan, menulis ke pointer ini akan menyebabkan kesalahan run-time atau akan menimpa beberapa memori yang berdekatan.
*p = 5; // run-time error: stack corruption
Berbeda dengan cast gaya-C, cast statis akan memungkinkan kompiler untuk memeriksa apakah tipe data pointer dan pointee kompatibel, yang memungkinkan programmer untuk menangkap tugas pointer yang salah ini selama kompilasi.
int *q = static_cast<int*>(&c); // compile-time error
Anda juga dapat memeriksa halaman ini untuk penjelasan lebih lanjut tentang pemain C ++: Klik Di Sini
Lihat perbandingan dari operator casting C ++ .
Namun, menggunakan sintaks yang sama untuk berbagai operasi casting yang berbeda dapat membuat maksud programmer tidak jelas.
Selain itu, mungkin sulit untuk menemukan jenis gips tertentu dalam basis kode besar.
generalisasi para pemeran C-style bisa berlebihan untuk situasi di mana semua yang dibutuhkan adalah konversi yang sederhana. Kemampuan untuk memilih antara beberapa operator casting yang berbeda dengan tingkat daya yang berbeda dapat mencegah programmer untuk secara tidak sengaja melakukan casting ke tipe yang salah.
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!
}
Sebuah posting hebat yang menjelaskan berbagai pemeran di C / C ++, dan apa yang dilakukan pemeran gaya-C: https://anteru.net/blog/2007/12/18/200/index.html
Casting C-Style, menggunakan sintaks variabel (tipe). Yang terburuk yang pernah ditemukan. Ini mencoba melakukan cast berikut, dalam urutan ini: (lihat juga C ++ Standard, 5.4 expr.cast paragraf 5)
- const_cast
- static_cast
- static_cast diikuti oleh const_cast
- reinterpret_cast
- reinterpret__cast diikuti oleh const_cast
static_cast
memeriksa pada waktu kompilasi bahwa konversi tidak antara jenis yang jelas tidak kompatibel. Berlawanan dengan dynamic_cast
, tidak ada pemeriksaan untuk kompatibilitas tipe yang dilakukan pada saat run time. Juga, static_cast
konversi belum tentu aman.
static_cast
digunakan untuk mengkonversi dari pointer ke kelas dasar ke pointer ke kelas turunan, atau antara tipe asli, seperti enum ke int atau float ke int.
Pengguna static_cast
harus memastikan bahwa konversi tersebut aman.
Para pemeran C-style tidak melakukan pemeriksaan apa pun, baik pada saat kompilasi atau pada saat run time.
Karena ada berbagai jenis casting masing-masing dengan semantik yang berbeda, static_cast <> memungkinkan Anda untuk mengatakan "Saya sedang melakukan konversi legal dari satu jenis ke yang lain" seperti dari int ke double. Pemain gaya C biasa bisa berarti banyak hal. Apakah Anda casting up / down? Apakah Anda menafsirkan ulang pointer?