IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası
  sohbet

 Kayıt ol  Topluluk
Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 18 Aralık 2010, 21:34   #1
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
C++ tür dönüşümü işleçleri




C++'ta derleyicinin otomatik olarak yaptıklarının dışında beş tane tür dönüşümü vardır:

  • 1) static_cast
  • 2) const_cast
  • 3) dynamic_cast
  • 4) reinterpret_cast
  • 5) C'den kalan parantezli tür dönüşümü

C'nin tür dönüşümü hâlâ en güvensizidir. C++'ın getirdikleri içinde de reinterpret_cast, davranışı çalışılan ortama bağlı olduğu için ve nesnelerin bitlerini değişik anlamda kullandırdığı için en güvensizidir.

C'den kalan tür dönüşümünü zaten hiç kullanmayın. Derleyici size bu konuda hiçbir yardımda bulunmaz. C++'ın getirdiklerini kullanırsanız, yanlış kullandığınız yerlerde derleme hataları ile uyarılabilirsiniz.

Aslında zaten tür dönüşümlerinden her zaman için uzak durmaya bakın. Tür dönüşümünün neden gerektiğini soruşturun ve kaçınmaya çalışın.

1) static_cast: Derleme zamanında bilinen tür dönüşümleri için kullanılır. Programcının derleyiciye "ben bu nesnenin çalışma zamanında bile aslında şu türden olduğundan eminim" demesi gibidir. (Buradaki 'static' sözcüğü, derleme zamanını belirliyor.)

Derleyici yasal olmayan dönüşümlerde hata verir. Yine de programcının derleyiciye yalan söylememesi iyi olur
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
İşte derleyiciye yanlış bilgi verdiğimiz için göçen bir Program:


PHP Kod:   Kodu kopyalamak için üzerine çift tıklayın!
#include <iostream>

struct Hayvan
{};

class 
Kus : public Hayvan
{
    
int p_;

    
enum birSayi 42 };

public:
    
    
Kus() : p_(new int(birSayi))
    {}

    ~
Kus() { delete p_; }
    
    
void kanatCirp()
    {
        
// Bellege erisiyoruz.
        // Eger bunu bir Fil icin yaparsak,
        // program buyuk olasilikla 'Segmentation
        // fault' verecektir.
        
        
if (*p_ == birSayi)
        {
            
std::cout << "Ucabiliyoruuum! ";
        }
        else
        {
            
std::cout << "(Eger bu noktada program
gocmediyse) "
                      
<< "Kus degil miyim neyim?
Dusuyoruuuuum! "
;
        }
    }
};

struct Fil : public Hayvan
{};

void agactanAtla(Hayvan hayvan)
{
    
// Ornegin bu programda agactanAtla
    // islevinin hep Kus turu icin
    // cagrildigindan eminiz.
    // (Oyle oldugunu saniyoruz.)

    
Kus kus static_cast<Kus &>(hayvan);
    
kus.kanatCirp();
}

int main()
{
    
Kus kus;
    
Fil fil;

    
agactanAtla(kus);
    
agactanAtla(fil);


Yukarıdaki örnekte, aslında Hayvan türüyle çalışan, ama belli bir noktada bir Kus'un sunduğu kanatCirp işlevini çağırması gereken agactanAtla adlı bir işlev var.

Programcı, o noktada 'hayvan' değişkeninin aslında gerçekten bir Kus olduğunu düşünerek derleyiciye bunu bildiriyor. Derleyici de programı buna inanarak derliyor.

Çalışma zamanında, işlev ilk çağrıldığında çalışıyor ama ikincisinde göçüyor. Bu örneği, static_cast'in bir doğru, bir de yanlış kullanımını göstermek için verdim.

2) const_cast: Aslında const ve/veya volatile olmadığını bildiğimiz, ama bir noktada karşımıza const ve/veya volatile olarak çıkan bir nesnenin const'lığını ve/veya volatile'lığını kaldırmak için kullanılır. Yine nesnenin gerçekten öyle olduğundan emin olmamız gerekir.

Bazı insanlar, volatile ile de çalıştığı için, adının bunu da belirtecek şekilde seçilmiş olması gerektiğini düşünürler.
Örneğin 'cv_cast' gibi bir ad daha uygun olabilirmiş; çünkü C++ standardında const ve/veya volatile belirteçlerine de her birden 'cv-qualification' denir.

Çoğunlukla const referans (veya gösterge) alması gerektiği halde kötü tasarım sonucu const olmayan referans (veya gösterge) alan işlevleri çağırmada kullanılır. Böyle işlevler bazı kütüphanelerde karşımıza çıkabilirler.


PHP Kod:   Kodu kopyalamak için üzerine çift tıklayın!
#include <iostream>
// Kotu tasarlanmis bir islev.
// Parametresinde degisiklik yapmadigi
// halde onu 'const' olarak tanimlamamis.

int toplam_a_harfi(char dizgi)
{
    
int toplam 0;
    
    for ( ; *
dizgi; ++dizgi)
    {
        if (*
dizgi == 'a') ++toplam;
    }
    
    return 
toplam;
}

// Bu islev, parametresinde degisiklik
// yapmayacagi icin, onu dogru olarak
// 'const' olarak tanimlamis.

int toplam_a_harfinin_karesi(char const * dizgi)
{
    
// Ama cagirdigi islev bunun kadar duyarli
    // olmadigi icin, o islevi cagirabilmek icin
    // const_cast kullaniyor

    
char const_cast<char *>(dizgi);
    
int const toplam_a toplam_a_harfi(d);
    return 
toplam_a toplam_a;
}

int main()
{
    
std::cout << toplam_a_harfinin_karesi("araba") << ' ';



 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları reklam ver Benimmekan Mobil Sohbet
Cevapla

Etiketler
dönüşümü, işleçleri, tür


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Kapalı
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
Text -> Ascii Dönüşümü Feragat mIRC Parça Kodlar 0 02 Kasım 2014 14:57
Sorguda birden fazla koşul kullanma AND (ve) ve OR (ya da) işleçleri hAte MySQL 0 16 Ekim 2014 15:12
Enerji Dönüşümü PySSyCaT Çevre Terimleri Sözlüğü 0 27 Eylül 2014 02:13
Laplace Dönüşümü Elysian Matematik 0 23 Ocak 2014 16:49
Ayrık Fourier Dönüşümü Liaaa Ödev ve Tezler 0 13 Haziran 2012 14:31