Anasayfa

C ve Sistem Programcıları Derneği

  • CSD Hakkında
    • Yönetim Kurulu
    • Referanslar
    • Üyelik
    • Adres
    • Kroki
    • İletişim
  • Kurslar
    • Kurs Başvurusu
    • Eğitmenler
  • Seminerler
    • Seminer İste
    • Seminer Ver
  • Kaynaklar
    • Yararlı Linkler
    • Kaynak Kod Arşivi
    • Makaleler
    • Çalışma Soruları
    • Yararlı Kitaplar
    • Dosya Arşivi
    • Döküman Arşivi
  • Duyurular
  • Haberler
  • İş İlanları
    • İş İlanı Gönder
  • SSS
  • Kurs Başvurusu

menü

  • CSD Hakkında
    • Yönetim Kurulu
    • Referanslar
    • Üyelik
    • Adres
    • Kroki
    • İletişim
  • Kurslar
    • Kurs Başvurusu
    • Eğitmenler
  • Seminerler
    • Seminer İste
    • Seminer Ver
  • Kaynaklar
    • Yararlı Linkler
    • Kaynak Kod Arşivi
    • Makaleler
    • Çalışma Soruları
    • Yararlı Kitaplar
    • Dosya Arşivi
    • Döküman Arşivi
  • Duyurular
  • Haberler
  • İş İlanları
    • İş İlanı Gönder
  • SSS
  • Kurs Başvurusu

e-posta ile bilgilendirme.

Derneğimizdeki etkinliklerden haberdar olun!

Haber mektubu üyeliğiniz

Kimler çevrimiçi

Şu an 0 kullanıcı ve 4 ziyaretçi çevrimiçi.
""
dreamhost
Anasayfa

C++0x - Varsayılan Hale Getirilmiş ve Silinmiş Fonksiyonlar (Defaulted and Deleted Functions)

22.06.2010 - 15:17 tarihinde aslank gönderdi
Yazan: 
Kaan Aslan

   Bilindiği gibi C++’ta sınıfın varsayılan başlangıç fonksiyonu (default constructor), kopya başlangıç fonksiyonu (copy constructor), kopya atama operatör fonksiyonu (copy assignment operator) ve bitiş fonksiyonu (destructor) özel fonksiyonlardır. Bu fonksiyonlar programcı tarafından bildirilmezse derleyici tarafından bildirilirler ve eğer kod içerisinde onlara gereksinim duyulmuşsa yine derleyici tarafından tanımlanırlar. Varsayılan başlangıç fonksiyonu diğer başlangıç fonksiyonlarından bu bağlamda farklıdır. Varsayılan başlangıç fonksiyonunun derleyici tarafından bildirilip tanımlanması için programcının sınıf için hiçbir başlangıç fonksiyonu bildirmemesi gerekir (buna kopya başlangıç fonksiyonu da dahildir). Sınıflarda derleyicinin kendisinin bildirip tanımlayabildiği bu tür fonksiyonlara özel üye fonksiyonlar (special member functions) denir. Bu konu C++ standartlarında 12. Bölümde (Special Member Functions) ele alınmaktadır.  

    C++2003’te X sınıf ismi olmak üzere sınıfın aşağıdaki parametrik yapılara sahip başlangıç fonksiyonlarına kopya başlangıç fonksiyonu denir ve bu parametrik yapıların herhangi birine ilişkin fonksiyon bildirildiğinde derleyici artık kopya başlangıç fonksiyonunun bildirilmiş olduğunu varsayar:
 
X &
const X &
volatile X &
const volatile X &

 
(sınıfın X parametreli fonksiyonun kopya başlangıç fonksiyonu olarak ele alınmadığına dikkat ediniz.) Kopya atama operatör fonksiyonu ise şu parametrik yapılara sahip fonksiyonlardan biridir:
 
X
X &
const X &
volatile X &
const volatile X &

 
(Sınıfın X parametreli fonksiyonun kopya atama operatör fonksiyonu olarak ele alınmadığına dikkat ediniz.) Bitiş fonksiyonları ise yazılmadığı durumda her zaman derleyici tarafından bildirilir ve tanımlanırlar.
  
    C++0x’te derleyici tarafından belirli koşullarda bildirilen ve tanımlanan fonksiyonların isteğe bağlı olarak koşulsuz tanımlanabilmesi sağlanmaktadır. Bunun için yukarıda belirtilen özel fonksiyonların dekleratöründe = default belirleyicisi kullanılır. Bu biçimde varsayılan hale getirilmiş olan özel fonksiyonu derleyici kendisi belirlemenin yapıldığı yerde tanımlar. Örneğin:
 
struct Sample { 
    Sample() = default;
    Sample(int a);
    //...
};

 
Burada programcı Sample sınıfı için int parametreli bir başlangıç fonksiyonu yazmıştır. Fakat aynı zamanda programcının varsayılan başlangıç fonksiyonu için de default belirlemesi yaptığını görüyorsunuz. Böylece derleyici varsayılan başlangıç fonksiyonunu –sanki programcı hiçbir başlangıç fonksiyonu bildirmemiş gibi- tanımlayacaktır. Artık aşağıdaki bildirimler geçerlidir:
 
Sample a;            // varsayılan başlangıç fonksiyonu çağrılır
Sample b(10);        // int parametresli başlangıç fonksiyonu çağrılır

 
Dikkat ediniz, = default belirlemesi yalnızca bir bildirime değil aynı zamanda tanımlamaya da yol açmaktadır. Yani yukarıdaki Sample sanınıfın eşdeğeri şöyledir:
 
struct Sample { 
    Sample()
    {}     
    Sample(int a);
    //...
};

 
= default belirlemesi inline yapılabilir ya da yapılmayabilir. Tanımlama işlemi bu belirlemenin görüldüğü yerde yapılmaktadır. Örneğin:
 
struct Sample { 
    Sample();
    Sample(int a);
    //...
};
 
Sample::Sample() = default; 

 
Burada tanımlama sınıf dışında yapıldığına göre inline değildir. Ayrıca = default belirlemesi sınıfı aggregate olmaktan ve POD (Plain Old Data) olmaktan çıkarmaz.
 
    = delete  sentaksıyla belirtilen fonksiyonlara silinmiş fonksiyonlar denir. = delete belirlemesi de aslında bir tanımlama işlemidir. Fakat silinmiş fonksiyonlara herhangi bir biçimde başvuru yapılması yasaklanmıştır. Böylece = delete bildirimi ile belirtilen fonksiyon tanımlanmış fakat çağrılması yasaklanış fonksiyon olarak ele alınır. Bu sayede artık kopyalanamaz sınıflar (noncopyable) şöyle bildirilebilir:
 
class X { 
    // ... 
    X(const X &) = delete;
    X &operator=(const X &) = delete;     
    //...
};

  
Bunun tam tersi şöyle yapılabilirdi:
 
class X { 
    // ...
    X(const X &) = default;
    X &operator=(const X &) = default;     
    //...
};


Tabi  kopya başlangıç fonksiyonu ve kopya atama operatör fonksiyonu zaten programcı tarafından bildirilmediğinde derleyici tarafından otomatik olarak bildirilecektir. Ancak bu biçimdeki açıkça belirtme vurgulama sağlayarak okunabilirliği artırabilir.
 
     = delete sentaksıyla silinmiş bir fonksiyon normal olarak isim aramasına sokulur. Fakat eğer overload resolution sonucunda bu fonksiyon seçilirse ona başvuru yapılmış olur. Örneğin: 
 
struct Sample {
    //...
    void foo (int a);
    void foo(int b) = delete;
    //...
};
//...
Sample s;
s.foo(10L);            // geçersiz! 

 
Burada overload resolution işlemi sonucunda long parametreli foo fonksiyonu seçilecektir. Fakat bu fonksiyon silinmiş bir fonksiyon olduğundan çağırma işlemi hatayla sonuçlanacaktır. Silinmiş fonksiyonların bildirim ve tanımlamaları ayrı ayrı yapılamaz. Bu fonksiyonlarda = delete sentaksının sınıf bildirimi içerisinde kullanılması gerekir.  Örneğin:
 
struct Sample { 
    Sample();
    //...
};
 
Sample::Sample() = delete;        // geçersiz!

 
Silinmiş fonksiyonlar inline kabul edilmektedir. Zaten derleyici tarafından bildirilmeyen fonksiyonların silinmiş olarak tanımlanması yasak değildir. Örneğin: 
 
class X { 
    //....
    X() = delete;                 // geçerli
    X(int a); 
    //...
};

 
Sınıf türünden dinamik tahsisatın engellenmesi için new operatör fonksiyonu silinebilir. Örneğin:
 
struct Sample {
    //...
    void *operator new(std::size_t) = delete;
    void *operator new[](std::size_t) = delete;
    //...
};
//...
Sample *p1 = new Sample();          // geçersiz!
Sample *p2 = new Sample[10];        // geçersiz!

 
static fonksiyonlar ve global fonksiyonlar da silinmiş hale getirilebilirler. 




Kaynaklar

1. Crowl, L. (2007). Defaulted and Deleted Functions. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2210.html adresinden alınmıştır.

2. Stroustrup, B. (2006). Control of Class Defaults. http://wiki.dinkumware.com/twiki/pub/Wg21portland/EvolutionWorkingGroup/controlofdefaults.pdf adresinden alınmıştır. 

3. Stroustrup, B. (2008). C++0x - The Next ISO C++ Standard. http://www.research.att.com/~bs/C++0xFAQ.html adresinden alınmıştır.

4. Working Draft, Standard for Programming Language C++ (N2798=08-0308). (2008). http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/ adresinden alınmıştır.

  • Yazıcı uyumluYazıcı uyumlu
  • Arkadaşa gönderArkadaşa gönder
  • PDFPDF

Adres: 2.Taşocağı Cd. Oğuz Sk. Barbaros Apt. No: 11/4 PK: 34387  Mecidiyeköy / İSTANBUL Tel: (212) 274 63 60  (212) 274 99 89  (212) 275 88 97  (212) 288 35 20 Fax: (212) 275 88 97 E-Posta: csystem@csystem.org

İçerik yayınları
Fervens Drupal theme by Leow Kah Thong. Designed by Design Disease and brought to you by Smashing Magazine.