Apa perbedaan antara static_cast <> dan style casting C?

Jawaban:

217

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.

Lembah kecil
sumber
67
Satu-satunya gips yang bisa gagal saat runtime adalah dynamic_casts.
R. Martinho Fernandes
12
C ++ reinterpret_cast <T> (U) dapat gagal pada waktu berjalan cukup banyak dengan cara yang sama dengan gaya C cast, dan mereka semua sangat berbeda dari bagaimana dynamic_cast <T> (U) gagal.
Christopher Smith
20
˗1 normal C cast (int)somethingtidak dapat gagal - Anda mendapatkan cast ke int atau compiler error.
Tomáš Zato - Pasang kembali Monica
2
Bisakah Anda menguraikan mengapa gips C ++ dicari lebih mudah daripada gips C?
Minh Tran
3
@MinhTran Untuk gaya C ++ Anda dapat mencari kata kunci "cast" melalui file sumber Anda. Tapi apa yang bisa kamu lakukan dengan para pemain c-style?
huangzonghao
176

Singkatnya :

  1. static_cast<>() memberi Anda kemampuan memeriksa waktu kompilasi, pemeran C-Style tidak.
  2. static_cast<>() lebih mudah dibaca dan dapat dilihat dengan mudah di mana saja di dalam kode sumber C ++, C_Style cast is'nt.
  3. Niat disampaikan jauh lebih baik menggunakan gips C ++.

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

Breeze
sumber
17
Saya pikir alih-alih "pointer 4-byte" yang Anda maksudkan adalah "pointer ke tipe data 4-byte"
iheanyi
tetapi memungkinkan int q = static_cast <int> (c);
TonyParker
3
@ TonyParker Itu karena tidak ada yang salah dengan kalimat itu.
Braden Best
15

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.

Eugene Yokota
sumber
14
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!
}
Rishi Khaneja
sumber
5
Bisakah Anda menjelaskan lebih lanjut jawaban Anda dengan menambahkan sedikit deskripsi tentang solusi yang Anda berikan?
abarisone
1
Saya pikir jawabannya menunjukkan bahwa "static_casts" memeriksa konversi jenis untuk memastikan mereka ada di jalur yang benar dalam grafik hierarki. Dalam contoh khusus ini, casting dari A * ke B * atau B * ke A * diperbolehkan karena A dan B membentuk jalur dalam grafik hirarkis. C * tidak ada di jalur sehingga static_cast akan menghasilkan kesalahan waktu kompilasi. Sidenote: Mungkin perlu dicatat bahwa casting dari A * ke B * dapat menghasilkan NULL dengan dynamic_cast pada saat run time tergantung pada objek yang mendasari sebenarnya.
Tommy Chen
7

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)

  1. const_cast
  2. static_cast
  3. static_cast diikuti oleh const_cast
  4. reinterpret_cast
  5. reinterpret__cast diikuti oleh const_cast
Ying Xiong
sumber
5

static_castmemeriksa 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_castkonversi 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_castharus memastikan bahwa konversi tersebut aman.

Para pemeran C-style tidak melakukan pemeriksaan apa pun, baik pada saat kompilasi atau pada saat run time.

Kiriloff
sumber
3

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?

Doug T.
sumber