#429   2020-03-11 20:23 GMT        

Varsayılan olarak C++ herhangi bir kurucuyu örtük (implicit) olarak ele alır. Örnek:



MakeNegative fonksiyonu bir fraction bekliyor olsa da bunun yerine bir tamsayı 6 verdik. Fraction tek bir tam sayı alabilen kurucuya sahip olduğu için derleyici 6 tamsayısını örtük olarak fraction nesnesine dönüştürür. Bunu fraction(int, int) kurucusuyla ve makeNegative parametresinde f yi başlatarak gerçekleştirir.

F halihazırda Fraction nesnesi olduğundan makeNegative fonksiyonunun dönüş değerinden kopya kurucuyla tekrar maine geri döner.

Çıktı:
Copy constructor called
-6/1

Bu tür örtük dönüşümler her türlü başlatma yönteminde işe yarar. (direct, uniform, and copy).

Örtük dönüşümler için kullanılmaya elverişli kurucu fonksiyonlara dönüştürücü kurucu fonksiyon denir. C++11 den önce dönüştürücü kurucular sadece tek bir parametre alabiliyorken C++11 den sonra tek tip başlatma (uniform initialization) söz dizimiyle bu kaldırıldı ve artık dönüştürücü  kurucular birden fazla parametre alabiliyor.

Explicit anahtar sözcüğü

Örtük dönüşumler Fraction sınıfı icin mantıklı olsa da farklı kullanımlarda beklenmeyen davranışlara sebep olabilir.



Buradaki örnekte kullanıcı string ögesini char ile başlatmaya çalışıyor fakat char tam sayılar grubundan olduğu için derleyici bunu MyString(int) kurucusu kullanarak örtük olarak dönüştürmek isteyecektir ve bu daha beklenmeyen bir sonucu ekrana basacaktır.

Bu durumu ele almanın bir yöntemi ise explicit anahtar sözcüğünü kurucu fonksiyonların önünde kullanmaktır. Explicit olarak işaretlenen kurucu ve dönüşüm fonksiyonları implicit dönüşüm veya kopya başlatma için kullanılmayacaktır.



Yukarıdaki program derlenmeyecektir çünkü MyString(int) explicit olarak işaretlenmiş ve  x i MyString e dönüştürecek uygun bir kurucu fonksiyonda bulunmamaktadır. Ancak explicit ile sadece örtük dönüşümleri önlediğimizi unutmayın cast kullanarak bu dönüşümleri hala gerçekleştirebiliriz.



Doğrudan veya tek tip başlatmada da parametreler eşleşecek şekilde dönüştürülür.



Kural: Kurucu ve dönüşüm fonksiyonlarınızda  örtük dönüşüm hatalarını önlemek için explicit anahtar sözcüğünü kullanmayı deneyin.

Delete anahtar sözcüğü

MyString vakasında x in MyStringe örtük veya açik olarak dönüştürülmesi sezgisel olarak hoş sonuçlar doğurmayacağı durumlarda MyString(char) kurucusunu private yapabiliriz böylelikle char dönüşümünü kullanımdan kaldırmış oluruz. Bu durumda sorunu çözmemizin en iyi yolu C++11 ile gelen delete anahtar sözcüğüdür.



Ancak kurucu fonksiyon hala sınıfın içerisinden erişilebilir çünkü private belirteci fonksiyonu sadece dışarıdan erişime kapatır.



Bir fonksiyon delete anahtar sözcüğüyle silindiğinde bu fonksiyonun herhangi bir kullanımı derleyici hatasına sebep olacaktır.