Bagikan melalui


Operator static_cast

Mengonversi ekspresi ke tipe-id, hanya berdasarkan jenis yang ada dalam ekspresi.

Sintaks

static_cast <type-id> ( expression )

Keterangan

Di C++standar, tidak ada pemeriksaan jenis run-time yang dilakukan untuk membantu memastikan keamanan konversi. Di C++/CX, pemeriksaan waktu kompilasi dan runtime dilakukan. Untuk informasi selengkapnya, lihat Casting.

Operator static_cast dapat digunakan untuk operasi seperti mengonversi pointer ke kelas dasar ke pointer ke kelas turunan. Konversi tersebut tidak selalu aman.

Secara umum Anda menggunakan static_cast saat ingin mengonversi jenis data numerik seperti enum ke ints atau ints ke float, dan Anda yakin dengan jenis data yang terlibat dalam konversi. static_cast konversi tidak seaman dynamic_cast konversi, karena static_cast tidak ada pemeriksaan jenis run-time, sementara dynamic_cast itu. Penunjuk dynamic_cast yang ambigu akan gagal, sementara pengembalian static_cast seolah-olah tidak ada yang salah; ini bisa berbahaya. Meskipun dynamic_cast konversi lebih aman, dynamic_cast hanya berfungsi pada pointer atau referensi, dan pemeriksaan jenis run-time adalah overhead. Untuk informasi selengkapnya, lihat Operator dynamic_cast.

Dalam contoh berikut, garis D* pd2 = static_cast<D*>(pb); tidak aman karena D dapat memiliki bidang dan metode yang tidak ada di B. Namun, baris B* pb2 = static_cast<B*>(pd); ini adalah konversi yang aman karena D selalu berisi semua B.

// static_cast_Operator.cpp
// compile with: /LD
class B {};

class D : public B {};

void f(B* pb, D* pd) {
   D* pd2 = static_cast<D*>(pb);   // Not safe, D can have fields
                                   // and methods that are not in B.

   B* pb2 = static_cast<B*>(pd);   // Safe conversion, D always
                                   // contains all of B.
}

Berbeda dengan dynamic_cast, tidak ada pemeriksaan run-time yang dilakukan pada static_cast konversi pb. Objek yang ditujukkan oleh pb mungkin bukan objek jenis D, dalam hal ini penggunaan *pd2 bisa menjadi bencana. Misalnya, memanggil fungsi yang merupakan anggota D kelas, tetapi bukan B kelas, dapat mengakibatkan pelanggaran akses.

Operator dynamic_cast dan static_cast memindahkan pointer di seluruh hierarki kelas. Namun, static_cast bergantung secara eksklusif pada informasi yang diberikan dalam pernyataan pemeran dan karenanya dapat tidak aman. Contohnya:

// static_cast_Operator_2.cpp
// compile with: /LD /GR
class B {
public:
   virtual void Test(){}
};
class D : public B {};

void f(B* pb) {
   D* pd1 = dynamic_cast<D*>(pb);
   D* pd2 = static_cast<D*>(pb);
}

Jika pb benar-benar menunjuk ke objek jenis D, maka pd1 dan pd2 akan mendapatkan nilai yang sama. Mereka juga akan mendapatkan nilai yang sama jika pb == 0.

Jika pb menunjuk ke objek jenis B dan bukan ke kelas lengkap D , maka dynamic_cast akan cukup tahu untuk mengembalikan nol. Namun, static_cast bergantung pada pernyataan programmer yang pb menunjuk ke objek jenis D dan hanya mengembalikan penunjuk ke objek yang seharusnya D .

Akibatnya, static_cast dapat melakukan inversi konversi implisit, dalam hal ini hasilnya tidak terdefinisi. Diserahkan kepada programmer untuk memverifikasi bahwa hasil static_cast konversi aman.

Perilaku ini juga berlaku untuk jenis selain jenis kelas. Misalnya, static_cast dapat digunakan untuk mengonversi dari int ke char. Namun, yang dihasilkan char mungkin tidak memiliki bit yang cukup untuk menahan seluruh int nilai. Sekali lagi, diserahkan kepada programmer untuk memverifikasi bahwa hasil static_cast konversi aman.

Operator static_cast juga dapat digunakan untuk melakukan konversi implisit apa pun, termasuk konversi standar dan konversi yang ditentukan pengguna. Contohnya:

// static_cast_Operator_3.cpp
// compile with: /LD /GR
typedef unsigned char BYTE;

void f() {
   char ch;
   int i = 65;
   float f = 2.5;
   double dbl;

   ch = static_cast<char>(i);   // int to char
   dbl = static_cast<double>(f);   // float to double
   i = static_cast<BYTE>(ch);
}

Operator static_cast dapat secara eksplisit mengonversi nilai integral menjadi jenis enumerasi. Jika nilai jenis integral tidak termasuk dalam rentang nilai enumerasi, nilai enumerasi yang dihasilkan tidak ditentukan.

Operator static_cast mengonversi nilai penunjuk null ke nilai penunjuk null dari jenis tujuan.

Ekspresi apa pun dapat dikonversi secara eksplisit untuk mengetik kekosongan oleh static_cast operator. Jenis kekosongan tujuan dapat secara opsional menyertakan constatribut , volatile, atau __unaligned .

Operator static_cast tidak dapat membuang constatribut , volatile, atau __unaligned . Lihat Operator const_cast untuk informasi tentang menghapus atribut ini.

C++/CLI: Karena bahaya melakukan cast yang tidak dicentang di atas pengumpul sampah yang direlokasi, penggunaan static_cast hanya boleh dalam kode kritis performa ketika Anda yakin itu akan berfungsi dengan benar. Jika Anda harus menggunakan static_cast dalam mode rilis, ganti dengan safe_cast di build debug Anda untuk memastikan keberhasilan.

Lihat juga

Operator Casting
Kata kunci