Constructor & Default Constructor

Not: C++ konularını soru/cevap şeklinde kısaca bilgi vererek ve kod parçaları üzerinde inceleyerek anlatıyorum. Daha fazlası için lütfen araştırma yapınız.

Construct -> inşa etmek, kurmak
Constructor -> inşa eden, kurucu


Constructor hakkında bilmemiz gereken bazı bilgiler: (Yazının devamında bunları inceleyeceğiz)

  1. Constructor nesneyi hayata hazırlar.
  2. Her sınıfın constructorı mutlaka var.
  3. Ben constructor yazmassam benim yerime derleyici yazıyor.
  4. Constructor sınıf ismi ile aynı olmalıdır.
  5. Constructor geri dönüş kavramı yoktur. (void değil karıştırılmamalı)
  6. Constructor NON-STATIC üye fonksiyonudur.
  7. Constructor const OLAMAZ.
  8. Constructor OVERLOAD edilebilir.

  • Bir sınıf nesnesi için bir bellek alanı elde etmemiz onu kullanılabilir bir sınıf yapmıyor. Kullanılabilir olması için ona bir ilk değer vermek gerekiyor.

  • Bir nesne hayata geldiğinde o nesnenin kullanılabilmesi için bazı kaynaklar edinmesi gerekiyor. Yani sadece ilk değer vermek olarak düşünmeyin, bazıları kaynak edinecekler.

  • C++ dilinde sınıflar için bazı fonksiyonlar var ki mutlaka olmak zorunda. Bu fonksiyonlara özel fonksiyonlar diyoruz. Yani bu fonksiyonlar biz yazarsak bizimkiler kullanılacak, biz yazmassak derleyeci bizim yerimize yazıp kullanacak. Constructor da özel fonksiyonlardan birisi.

  • Constructor için keyfi isim veremiyoruz. Yani bu isim class ismi ile aynı olmak zorunda. Derleyici constructor olup olmadığını sınıf ismi ile aynı olup olmadığına bakarak anlıyor.

  • Constructor’ın geri dönüş değeri gibi bir kavram yok. Yani void değil. Karıştırılmasın geri dönüş değeri diye bir kavram yok.

Constructor static üye fonksiyon mu yoksa non-static üye fonksiyon mu?

  • Constructor non-static üye fonksiyonudur. Çünkü nesnemize ilk değer vereceğine göre büyük olasıklıkla veri elemanlarına değerler yerleştirecek. Veri elemanlarına değer yerleştirmesi için nesnemizin adresini alması lazım. Nesnemizin adresini alması demek this göstericisinin olması demek.

Constructor sınıfın public bölümünde olmak zorunda mı?

  • Hayır böyle bir zorunluluk yok.
  • Eğer sınıfın private bölümüne koyarsak, derleyici tarafından çağırıldığı zaman yine sentaks hatası olur. Hatırlarsak clientlar sınıfın sadece public bölümüne erişebiliyorlardı. Hata olan constructor’ın private olması değil, private bir fonksiyonun çağırılması.
  • Constructor’ı private bölümüne yazacağımız özel bazı senaryolar var. (Örnek: Singleton Pattern)
#include <iostream>

using namespace std;

class MyClass {
MyClass();
public:
void func();
};

int main(){
MyClass m; // Gecersiz çünkü constructor private
// Calling a private constructor of class ‘MyClass’
return 0;
}

Default Constructor (Varsayılan Kurucu İşlev)

  • Parameter değişkeni olmayan yada tüm parametre değişkenleri varsayılan argüman alan constructor.

  • Başka bir deyişle, argüman göndermeden çağırılabilen constructor.


Argüman nedir?

  • Fonksiyon çağrılarıyla fonksiyonlara gönderilen ifadelere argüman yada actual parameter denir.

  • Biz herhangi bir constructor yazmassak, derleyici bize non-static, inline, public bir constructor yazar.


non-static nedir?

  • Basit olarak static anahtar sözcüğü olmayan, yani this göstericisine sahip olan demektir.
  • Derleyicinin yazdığı constructor’ın static olma veya private olma imkanı yoktur.

-> Şimdi biraz kod yazarak kuralları inceleyelim.

#include <string>
#include <iostream>

// Constructor Overload
class Date {
public:
Date();
Date(int d, int m, int y);
Date(const std::string &);
};

// Constructor Overload
class Triangle {
public:
Triangle(double d1, double d2, double d3);
Triangle(double base, double height);
};
#include <iostream>
// Constructor explicit olarak çağrılamaz. (Yani ismi ile çağrılamaz.)
class ExpClass {
public:
ExpClass();
ExpClass(int, int);
};

int main(){
ExpClass exp;
exp.ExpClass(); // GEÇERSİZ
// error: cannot refer to type member 'ExpClass' in 'ExpClass' with '.'
}