C++' da derleyicinin yaptığı otomotik tür dönüşümleri dışında 5 farklı tür dönüşümü vardır:
- static_cast
- const_cast
- dynamic_cast
- reinterpret_cast
- geleneksel C style cast işlemi
Bu yazımızda static_cast tür dönüşümünü anlatacağız. İlerleyen yazılarımızda sırala diğer tür dönüşümlerını anlatmaya devam edeceğiz.
static_cast derleme zamanına ilişkin tür dönüşümleri için kullanılır. Aşağıda benzer tür dönüşümü için kullanılabilecek 3 farklı senaryoyu içeren bir örnek bulunmaktadır.
3 farklı tür dönüşüm örneği |
- 7. satırda doğrudan atama yapılmış ve hiçbir tür dönüşümü direktifi kullanılmamıştır.
- 8. satırda konu başlığını içeren tür dönüşümü.
- 9. satırda ise geleneksel C tür dönüşümü yapılmış.
Bu kodu Microsoft compiler' ı ile derlerseniz karşınıza 7. satır için şöyle bir uyarı gelecektir.
"warning C4244: 'initializing': conversion from 'double' to 'int', possible loss of data"
Note: Calıştığınız bazı projelerde gelecekte olası hataları önlemek adına compiler flag'lerinden tüm uyarıları error olarak ayarlanmış ise bu kodu derlemeniz mümkün olmayacaktır.
Dolayısıyla türler arası bir geçiş yapacaksanız ve özellikle büyük kümeyi kapsayan bir türden küçük kümeye doğru bir dönüşim yapılacaksa compiler'a ben ne yaptığımı biliyorum direktifini vermek için tür dönüşümünü dilin verdiği olanaklar içinde en doğru şekilde belirtmek gerekir. Bu senaryoda tabiki en doğru tercih static_cast olacaktır. Aşağıdaki örnekte ise üç farklı tür dönüşümü için compilerın ürettiği makina kodu görülebilir.
Aşağıdaki örnekte ise çalışma zamanında static_cast işleminin nasıl hataya yol açacağına ilişkin bir örnek yer almaktadır. Fonksiyon upcast işlemi yapmakta ve üst sınıfının public bir fonksiyonunu çağrılmaktadır. Fakat ikinci fonksiyon çağrısınında program çökecektir.
Bu nedenle her static_cast işlemi derlendi ise çalışma zamanında bir problemle karşılaşmayacağınız anlamına gelmez. Aşağıdaki örnekte ise derleme hatası oluşturacak bir casting örneğini görmektesiniz.
Kodu derlemeye çalıştığımızda aşağıdaki gibi bir hata ile karşılacaksınız.
Peki bu örneği geleneksel C tür dönüşümü ile yapmaya çalışsaydık;
Kodumuz güvenli olmayacak şekilde derlenebilecekti. Aslında bu örnek ilerideki yazılarımızın konusu olacak neden geleneksel C tür dönüşümünü kullanmamamız gerektiğine bir örnektir. Peki static_cast işlemi tamamiyle compile time'e ilişkin mi yoksa runtime'e etki ediyor mu? Aşağıda iki farklı örnek üzerinden açıklamaya çalışalım:
- static_cast<std::string>("Doctor")
- static_cast<int>(2.6784)
İlk örnekte const char* türünden std::string türüne dönüşüm yapılacak ve std::string ctor cağrılması gerekecektir ki bu işlem runtime' de gerçekleşecektir. İkinci örnekte ise derleme zamanında gerçekleşecektir. Aşağıda ise yukarıdaki iki örneğin derleme sonucu oluşan makina kodunu görebilirsiniz.