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 const
atribut , volatile
, atau __unaligned
.
Operator static_cast
tidak dapat membuang const
atribut , 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.