C++ Constructor


#1
C++ Constructor

C++ Constructor

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

~> 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.

~> Kaynak kullanımı, 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.

  1. Constructor nesneyi hayata hazırlar.
  2. Her sınıfın constructorı mutlaka var.
  3. Ben constructor yazmassam benim yerime derleyici yazıyor.

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…

Bu konuda bazı kurallar var.
~> Bu fonksiyona 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.
~> Bu fonksiyonları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 fonksiyonu. Çü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

~> Ama 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 constructorin private olması değil, private bir fonskiyonun çağırılması.

~> Private constructor bazen kullanılıyor ama çoğunluk senaryosu değil.(Singleton)

Private Constructor

Default Constructor (Varsayılan Kurucu İşlev)

~> Parametre değişkeni yoksa yada tüm parametre değişkenleri varsayılan argüman alıyorsa bu default constructor

~> Argüman göndermeden çağırılabilen constructorlara default constructor diyoruz


Argüman Nedir?

~> Fonksiyon çağrılarıyla fonksiyonlara gönderilen ifadelere arguman yada actual parameter denir.

~> Biz hiçbir constructor yazmassak derleyici bize non-static inline public bir constructor yazar.


non-static ne demek?

~> static keywordu olmayan, yani this göstericisine sahip olan demek

~> Derleyicinin yazdığı constructor ın static olma imkanı yok, private olma imkanı yok


inline, fonksiyonlar için 2 farklı model var.

  1. Biz bir fonksiyona çağrısı yapıyoruz. Derleyici bu fonksiyona giriş çıkış kodlarını üretiyor fakat bu fonksiyonun kendi kodunun bu koda bağlanması işini linker’a havale ediyor. Peki bunu nasıl yapıyor? external reference yazıyor.
  2. inline fonksiyon dediğimiz şöyle, derleyici fonksiyonun tanımını da görücek, fonskiyonun tanımını gördüğü için fonksiyonu derleyecek object kodunu doğrudan çağırdığı yere gömücek. Yani burada artık linker bypass edilmiş oluyor. inline yapmakla derleyiciye şunu söylüyoruz, derleyici sen linker’i felan bırak gel bu işi aramızda halledelim.

~> inline fonksiyon ile inlined fonksiyonu birbirine karıştırmamak gerek. Bir fonksiyona inline demek böyle bir rica da bulunmak demek. Derleyici bu ricayı yerine getirebiliyorsa artık o fonksiyon inlined olucak.

~> Ama semantik olarak şöyle bir avantaj olacak. Derleyici bunu yerine getirse de getirmese de client tarafından kodla bunun bir alakası yok. Nasıl fonksiyon çağırıyorsak öyle çağırıcaz.

~> Constructor const olamaz
~> Constructor overload edilebilir, fazlaca karşılaşılan bir senaryo
(function overload resolution)

Constructor OverloadConstructor Overload

~> Constructor explicit olarak çağrılamaz. (constructor ismi ile çağırılamaz)

Constructor Hatalı ÇağırmaConstructor C++11 Default Keyword

~> Function overload kuralları burada tamamen geçerli

Function OverloadConstructor C++11

~> Nesne ne zaman hayata başlarsa constructor o zaman çağırılıyor.

~> C++ diğer dillerden farklılığı, primitive nesneler gibi, yerel nesneler oluşturabiliyoruz. Yani otomatik ömürlü, static ömürlü ve dinamik ömürlü nesne oluşturabiliyoruz.

ConstructorDefault ConstructorReferans demek nesne demek değilPointer — ConstructorConstructorStatic ömürlü nesneler main’den önce çağırılırStatic Yerel Sınıf NesneleriConstructor

New Operatörü

~> Dinamik nesne yaratılması için heap te bir alan yaratılması gerekiyor.
Bu alanı tahsis eden operatör new (bu bir fonksiyonun ismi)
(new bir operatör, operator new fonksiyon)

~> new operatörü önce operator new çağırıyor. Heap te bir alan elde ediliyor. O fonksiyon malloc un eşdeğeri bir fonksiyon. Yani size of myclass kadar yer ayırıyor. O adresi void* olarak döndürüyor. Derleyici void* myclass* dönüştürerek o adres için constructor çağırıyor.

~> Constructor çağırılmasını sağlayan pointer değil. new operatörünün kullanılması.

New Operator

~> 2 tane new operatörü var. tekil new operatörü && [] new operatörü

New OperatorNon-Static FunctionUniform InitializerPointer AritmetiğiC++03 ve C++11 Kullanımları

Kaynak: https://goo.gl/Y4QMZH