C++ dilinde tür dönüştürme, bir nesneyi bir türden diğerine dönüştürmek için derleyiciye açıkça talimat vermeyi sağlar. C++'ın erken sürümlerinde (C++98) bu amaçla C tarzı dönüşüm ((int)x) kullanılıyordu. Ancak bu yaklaşım örtük (implicit) olup genellikle hatalara yol açar çünkü derleyici dönüşümün doğruluğunu veya güvenliğini kontrol edemez. Güvenliği artırmak için, aralarında static_cast'ın önemli bir rol oynadığı özel tür dönüştürme operatörleri getirilmiştir.
Konuya Giriş:
static_cast anahtar kelimesinin önceki gelişimde, geliştiriciler sıklıkla örtük dönüşümlerden dolayı hatalarla karşılaşıyordu. C++98 ile birlikte static_cast'ın tanıtılması, farklı niyetlerin açıkça ayrılmasına imkan tanıdı ve dönüşümün sadece mantıklı yerlerde derleme aşamasında yapılmasını garanti etti.
Sorun:
Sıklıkla uyumlu türler (örneğin, sayısal değerler veya miras alınmış sınıfların işaretçileri) arasında dönüşüm yapmak gerekebilir, ancak bunu şeffaf ve güvenli bir şekilde yapmak önemlidir. C tarzı dönüşüm, derleyici tarafından kontrol edilen ve potansiyel olarak tehlikeli dönüşümleri karıştırdığı için sorun yaratır.
Çözüm:
static_cast, uyumlu türlerin açık, ancak istatiksel olarak kontrol edilebilir dönüşümü için tasarlanmıştır. C tarzı dönüşümden daha güvenlidir ve derleme aşamasında tamamen uyumsuz türlerin dönüştürülmesine izin vermez.
Kod örneği:
class Base { }; class Derived : public Base { }; Base* b = new Derived(); Derived* d1 = static_cast<Derived*>(b); // doğru, eğer b gerçekten Derived'e işaret ediyorsa int x = 10; double y = static_cast<double>(x); // çalışır
Anahtar özellikler:
static_cast, tamamen ilgisiz türler arasında dönüşüm yapmak için kullanılabilir mi, örneğin int ve double**?**
Hayır, derleyici, türler doğrudan bağlı olmadığından bunun için açık bir ara dönüşüm olmadan bunu gerçekleştirmeye izin vermez. Örneğin:
int* p1; double* p2 = static_cast<double*>(p1); // derleme hatası
static_cast'ı, temel sınıftan türetilmiş bir sınıfa güvenli bir "düşürme" dönüşümü için kullanabilir miyim? Eğer işaretçi türetilmiş tür üzerinde işaret etmiyorsa ne olur?
static_cast, böyle bir dönüşümü gerçekleştirebilir, ancak çalışma zamanında gerçek türü kontrol etmez. Eğer temel işaretçi gereken türetilmiş sınıfın nesnesine işaret etmiyorsa, sonuç belirsiz bir davranış olacaktır:
Base* base = new Base; Derived* wrong = static_cast<Derived*>(base); // UB! Tür yanlış
static_cast, özel mirasla nasıl davranır?
static_cast, özel veya korunan miras yolu ile türetilmiş sınıfa işaretçi veya referans dönüştürmeye izin vermez — derleme zamanı hatası oluşur.
Programcı, nesnenin gerçek türünü kontrol etmeden, herhangi bir temel sınıf işaretçisini türetilmiş sınıfa dönüştürmek için static_cast'ı düşünmeden kullanıyor (örneğin hız optimizasyonu amacıyla).
Artıları:
Eksileri:
Nesne türünü ek meta veriler veya tasarım yoluyla kontrol ettikten sonra static_cast kullanmak (ya da sayısal türler arasında güvenli dönüşümler için).
Artıları:
Eksileri: