- Tam Sayı Tipleri
- Reel Tipler (double, float)
- Karmaşık sayı (complex)
- String Tipi
- Yapılar, Sınıflar ve Arayüzler
- Dinamik Dizi Nesnesi
- Matrisler ve vektörler
- Tip Dönüşümü
- Void Tipi ve NULL Sabiti
- Kullanıcı Tanımlı Tipler
- Nesne İşaretçileri
- Referanslar: Şekillendirici & ve Anahtar Sözcük this
Tip Dönüşümü
Sayısal tipleri dönüştürmek
Sıklıkla, bir sayısal tipi diğerine dönüştürme ihtiyacı doğar. Tüm sayısal tipler birbirlerine dönüştürülemezler. İzin verilen dönüşümlerin şeması:
Oklu kalın çizgiler neredeyse hiç bilgi kaybı olmadan gerçekleştirilen değişimleri gösterir. Char tipinin yerine bool tipi kullanılabilir (ikisi de 1 bayt bellek kaplar), int tipinin yerine color tipi kullanılabilir (4 bayt), long tipinin yerine datetime kullanılabilir (8 bayt kaplarlar). Aralıklı çizgi oklar çözünürlük kaybı gerçekleşebilecek dönüşümleri gösterir. Örneğin bir tamsayıdaki (int) hanelerin sayısı 123456789'a eşittir . Bu, float tipiyle temsil edilebilecek hane sayısından büyüktür.
int n=123456789;
|
float tipine dönüştürülen bir sayı aynı düzende olur ama daha az doğrudur. Siyah okların ters yönünde yapılan dönüşümler, muhtemel veri kaybı ile gerçekleştirilebilir. char ve uchar, short ve ushort, int ve uint, long ve ulong dönüşümleri (iki yöne dönüşümler) veri kaybına yol açabilir.
Kayan nokta değerlerinin tamsayı tipine dönüşümünün bir sonucu olarak, ondalık kısım daima silinir. Eğer float tipli bir sayıyı en yakın tamsayıya yuvarlamak istiyorsanız (-ki bir çok durumda daha kullanışlıdır), MathRound() fonksiyonunu kullanmalısınız.
Örnek:
//--- Kütleçekim ivmesi
|
Eğer iki değer, bir ikili işlem ile birleştirilmişse; işlem gerçekleştirilmeden önce daha düşük tipli işlenen, altta yer alan şemadaki önceliğe göre daha yüksek olan tipe dönüştürülür:
Veri tipleri char, uchar, short ve ushort; istisnasız olarak int tipine dönüştürülürler.
Örnekler:
char c1=3;
|
Hesaplanan ifade iki işlemden oluşuyor. İlk örnekte, char tipli c1 değişkeni int tipi bir geçici değişkene dönüştürülür. Çünkü bölümdeki ikinci işlenen, sabit 2'nin tipi daha yüksektir. 3/2 tamsayı bölümünün sonucunda int tipli '1' değerini elde ederiz.
Birinci örneğin ikinci işleminde, ikinci işlenen double tipli '0.3' sabitidir. Bu yüzden, ilk işlemin sonucu 1.0 değeri ile double tipli geçici değişkene dönüştürülmüştür.
İkinci örnekte char tipli değişken c1, double tipli bir geçici değişkene dönüştürülmüştür, çünkü bölme işleminin ikinci işleneni sabit '2.0', double tiplidir. Başka dönüşüm yapılmamıştır.
Sayısal Tiplerin Dönüşümü
MQL5 dilindeki ifadelerde, açık ve gizli (kapalı) olmak üzere iki tip dönüşümü de kullanılabilir. Açık tip dönüşümü şu şekilde yazılır:
var_1 = (tip)var_2; |
Bir ifade veya fonksiyon sonucu, var_2 değişkeni olarak kullanılabilir. Açık tip dönüşümünün fonksiyonel ifadesi de mümkündür:
var_1 = tip(var_2); |
Birinci örnek temelinde bir açık tip dönüşümü düşünelim.
//--- Üçüncü örnek
|
Bölme işlemi gerçekleştikten sonra c1 değişkeni açık olarak double tipine dönüştürülür. Ardından tamsayı sabiti 2, double tipli 2.0 değişkenine dönüşür. Dönüşümün sonucu olarak ilk işlenen, double tipini alır. Açık tip dönüşümü tekil bir işlemdir.
Ayrıca, tipleri dönüştürürken sonuç hoş görülebilir sınırların dışına çıkabilir. Bu durumda budama gerçekleşir. Örneğin:
char c;
|
İşlemler gerçekleştirilmeden önce (atama işlemleri hariç); veri, en yüksek öncelikli tipe dönüştürülür. Atama işlemlerinden önce ise veri, hedef tipe dönüştürülür.
Örnekler:
int i=1/2; // tip dönüşümü yok, sonuç 0
|
long/ulong tipli değişkenler double tipine dönüştürüldüğünde, tamsayı değerinin 9223372036854774784'den büyük veya -9223372036854774784'den küçük olması durumunda çözünürlük kaybı olabilir.
void OnStart()
|
String Tipi için Tip Dönüşümü
string tipi basit tipler arasında en yüksek önceliğe sahiptir. Bu yüzden, işlenenlerden biri string tipinde ise, diğer işlenen de otomatik olarak string tipine dönüştürülecektir. Dizgilerde basit diyadik toplama işleminin mümkün olduğunu not ediniz. string tipinin açık tip dönüşümü, dönüştürülecek her sayısal tip için izinlidir.
Örnekler:
string s1=1.0/8; // ifade double tipine dönüştürüldü,
|
Temel Sınıf İşaretçilerinden Türev Sınıf İşaretçilerine Tip Dönüşümü
Açık şekilde oluşturulmuş sınıf nesneleri, ilgili temel sınıfın nesneleri olarak da görülebilirler. Bu bazı ilginç sonuçlara yol açar. Örneğin, aynı temel sınıftan türetilmiş farklı sınıfların nesnelerinin, birbirlerinden belirgin şekilde farklı olabildikleri gerçeğini bir yana bırakırsak; bunları temel tipin nesneleri olarak gördüğümüz bir bağlantılı liste oluşturabiliriz. Ama tersi geçerli değildir: temel sınıf nesneleri otomatik olarak türetik sınıfların nesnesi olmazlar.
Temel sınıfın işaretçilerini, türetik sınıfın işaretçilerine dönüştürmek için açık dönüşüm kullanabilirsiniz. Fakat böyle bir dönüşümün kabul edilebilirliği konusunda emin olmalısınız. Çünkü, aksi durumda, önemli bir çalışma zamanı hatası gerçekleşir ve MQL5 programı durur.
dynamic_cast işlemcisi ile dinamik tip dönüşümü #
Dinamik tip dönüşümü 'dynamic_cast' işlemcisiyle gerçekleştirilir ve sadece sınıf işaretçileri için kullanılabilir. Tipin doğrulaması çalıştırma sırasında gerçekleştirilir. Yani, dynamic_cast işlemcisi kullanıldığında, derleyici tip dönüşümüne konu olan veriyi kontrol etmeyecektir. İşaretçinin, nesnenin gerçek veri tipi dışındaki tiplere dönüştürülmesinin sonucunda NULL değeri alınır.
dynamic_cast <type-id> ( expression ) |
type-id parametresi daha önce tanımlanan bir sınıf tipini işaret etmelidir. C++ dilinin aksine, expression işlemci tipi, void haricinde herhangi bir değeri alabilir.
Örnek:
class CBar { };
|
Ayrıca Bakınız