Bir kaç gün önce C++ 11 ile gelen yeni kabiliyetlere ilişkin yazdığım yazılara bakarken, bir takım özelliklere değinmediğimi fark ettim. Bu yazımda, bunlardan birisine çok hızlı bir şekilde göz atacağız: “Converting Constructors” ya da dönüştürücü yapıcılar.
C++ 11’den önce, sadece tek parametre alan ve “explicit” anahtar kelimesi belirtilmemiş sınıf yapıcıları, bu şekilde dönüştürücü yapıcı olarak kullanılabiliyordu. Fakat, C++ 11 ile gelen ortak ilklendirme kabiliyeti “Uniform Initialization” ile birlikte, bu kısıtlama kalkıyor ve artık birden fazla parametre alan ve “explicit” anahtar kelimesini almamış yapıcılar da, benzer şekilde kullanılabilecek.
Burada daha fazla ilerlemeden önce, bu şekilde yani “implicit” şekilde dönüştürme işlemleri her zaman istenen bir durum olmuyor ve bunun özellikle istenmediğini, sadece verilen tipte parametre verilmesini istediğiniz durumda “explicit” anahtar kelimesini eklemeniz gerekmekte.
Şimdi gelelim bu kabiliyetin kullanımına güzel bir örnek üzerinden geçmeye. Kafanızdaki bütün soruları cevaplayacağını düşünüyorum 🙂
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
struct A { // Dönüştürücü yapici A(int) {} // C++ 11 ile birlikte dönüştürücü yapici A(int, int) {} }; struct B { // Özellikle dönüştürme işini istemiyoruz explicit B(int) {} // Özellikle dönüştürme işini istemiyoruz // C++ 11 ile birlikte explicit bu yapiciler ile birlikte kullanılabilmeye baslandi. // Onceden zaten bırden fazla parametre ıcın donusturucu yapıcı durumu olmuyordu explicit B(int, int) {} }; int main() { A a1 = 1; // OK: kopyalanarak ilklendirme A::A(int) yı seçer A a2(2); // OK: direk ilklendirme A::A(int) yı seçer A a3 {4,5}; // OK: direk ortak ilklendirme (uniform initialization) A::A(int, int) yı seçer A a4 = {4,5}; // OK: kopya ortak ilklendirme (uniform initialization) A::A(int, int) yı seçer A a5 = (A)1; // OK: açık dönüştürme yapılır (static_cast), direk ilklendirme // B b1 = 1; // Hata: kopyalanarak ilklendirme explicit ten ötürü B::B(int) yi seçmez B b2(2); // OK: direk ilklendirme B::B(int) yi seçer. Burada 2.0F olsa yanlız yine hata alırdık ek not ;) B b3 {4,5}; // OK: direk ortak ilklendirme (uniform initialization) B::B(int, int)'yı seçer // B b4 = {4,5}; // Hata: kopya ortak ilklendirme yine B::B(int,int)'yi seçmez B b5 = (B)1; // OK: açık dönüştürme yapılır (static_cast), direk ilklendirme return 0; } |
Bu yazımız da bu kadardı sevgili dostlar, bir sonraki yazımda görüşmek dileğiyle. Bu sefer gerçekten kısa tuttum ama öyle değil mi 😉