Endorfin35+
Kayıtsız Üye
- Katılım
- 1 Mayıs 2020
- Mesajlar
- 4,409
Yapıcı ve Yıkıcı Fonksiyonlar (Constructor & Destructor):
Bir sınıftan bir nesne üretildiği anda otomatik olarak çalışan fonksiyonlara yapıcı fonksiyonlar denir. Benzer şekilde bir sınıftan üretilmiş olan nesne yok edildiği anda otomatik olarak çalışan fonksiyona da yıkıcı fonksiyon denir.
Yapıcı ve yıkıcı fonksiyonlar sınıf adı ile aynı isme sahip olmakla beraber yıkıcı fonksiyon adının önünde tilde "~" işareti de ayrıca olmak zorundadır. Ayrıca bu fonksiyonların dönüş değeri yoktur. Bu nedenle bu fonksiyonların başında int, void gibi ifadeler yer almaz.
Yapıcı fonksiyonun çalıştığını gösteren basit bir örnek verelim;
Personel sınıfından bir nesne (per1) ürettiğimiz zaman yapıcı fonksiyonumuzun çalıştığına dair bir çıktı alıyoruz. Pointer kullanarak bir nesne (per2) ürettiğimizde de aynı şekilde yapıcı fonksiyonumuzun çalıştığını görüyoruz.
Yıkıcı fonksiyonu da dahil ederek örneğimizi genişletelim;
per1 nesnemizi oluşturduğumuz zaman yapıcı fonksiyonun çalıştığını görüyoruz. Ardından program sonlandığı için yıkıcı fonksiyonumuzda otomatik olarak çalışıyor.
Şimdi şu örneğe bakalım;
Program çıktısından görüleceği üzere per1 ve per2 nesnesi için yapıcı fonksiyon çalışırken yıkıcı fonksiyon sadece per1 nesnesi için çalışıyor. Bunun nedeni per2 nesnesinin pointer kullanılarak hafızanın "heap" bölümünde oluşturulmuş olmasıdır. Bu durumda per2 nesnesi için de yıkıcı fonksiyonu çalıştırmak istersek delete komutu ile per2 nesnesi yok edilmelidir. Örneğimiz ile görelim;
Yapıcı ve yıkıcı fonksiyonların hangi şartlarda çalıştığını örneklemeye çalıştım. Ek olarak yapıcı ve yıkıcı fonksiyonlar sınıf bloğu dışında (prototip olmak şartı ile) tanımlanabilir. Örnekleyelim;
Bir sınıftan bir nesne üretildiği anda otomatik olarak çalışan fonksiyonlara yapıcı fonksiyonlar denir. Benzer şekilde bir sınıftan üretilmiş olan nesne yok edildiği anda otomatik olarak çalışan fonksiyona da yıkıcı fonksiyon denir.
Yapıcı ve yıkıcı fonksiyonlar sınıf adı ile aynı isme sahip olmakla beraber yıkıcı fonksiyon adının önünde tilde "~" işareti de ayrıca olmak zorundadır. Ayrıca bu fonksiyonların dönüş değeri yoktur. Bu nedenle bu fonksiyonların başında int, void gibi ifadeler yer almaz.
C++:
class personel
{
private:
//...
public:
// constructor / yapıcı fonksiyon;
personel()
{
//...
}
// destructor / yıkıcı fonksiyon;
~personel()
{
//...
}
};
Yapıcı fonksiyonun çalıştığını gösteren basit bir örnek verelim;
C++:
#include "stdio.h"
class personel
{
private:
char name[20];
int yovmiye;
public:
personel()
{
printf("Yapıcı Fonksiyon otomatik çalıştı. \n");
}
};
int main()
{
personel per1;
personel *per2= new personel();
}
Program Çıktısı:
Yapıcı Fonksiyon otomatik çalıştı.
Yapıcı Fonksiyon otomatik çalıştı.
Personel sınıfından bir nesne (per1) ürettiğimiz zaman yapıcı fonksiyonumuzun çalıştığına dair bir çıktı alıyoruz. Pointer kullanarak bir nesne (per2) ürettiğimizde de aynı şekilde yapıcı fonksiyonumuzun çalıştığını görüyoruz.
Yıkıcı fonksiyonu da dahil ederek örneğimizi genişletelim;
C++:
#include "stdio.h"
class personel
{
private:
char name[20];
int yovmiye;
public:
personel()
{
printf("Yapıcı Fonksiyon otomatik çalıştı. \n");
}
~personel()
{
printf("Yıkıcı Fonksiyon otomatik çalıştı. \n");
}
};
int main()
{
personel per1;
}
Program Çıktısı:
Yapıcı Fonksiyon otomatik çalıştı.
Yıkıcı Fonksiyon otomatik çalıştı.
per1 nesnemizi oluşturduğumuz zaman yapıcı fonksiyonun çalıştığını görüyoruz. Ardından program sonlandığı için yıkıcı fonksiyonumuzda otomatik olarak çalışıyor.
Şimdi şu örneğe bakalım;
C++:
#include "stdio.h"
class personel
{
private:
char name[20];
int yovmiye;
public:
personel()
{
printf("Yapıcı Fonksiyon otomatik çalıştı. \n");
}
~personel()
{
printf("Yıkıcı Fonksiyon otomatik çalıştı. \n");
}
};
int main()
{
personel per1;
personel *per2= new personel();
}
Program Çıktısı:
Yapıcı Fonksiyon otomatik çalıştı.
Yapıcı Fonksiyon otomatik çalıştı.
Yıkıcı Fonksiyon otomatik çalıştı.
Program çıktısından görüleceği üzere per1 ve per2 nesnesi için yapıcı fonksiyon çalışırken yıkıcı fonksiyon sadece per1 nesnesi için çalışıyor. Bunun nedeni per2 nesnesinin pointer kullanılarak hafızanın "heap" bölümünde oluşturulmuş olmasıdır. Bu durumda per2 nesnesi için de yıkıcı fonksiyonu çalıştırmak istersek delete komutu ile per2 nesnesi yok edilmelidir. Örneğimiz ile görelim;
C++:
#include "stdio.h"
class personel
{
private:
char name[20];
int yovmiye;
public:
personel()
{
printf("Yapıcı Fonksiyon otomatik çalıştı. \n");
}
~personel()
{
printf("Yıkıcı Fonksiyon otomatik çalıştı. \n");
}
};
int main()
{
personel per1;
personel *per2= new personel();
delete per2;
}
Program Çıktısı:
Yapıcı Fonksiyon otomatik çalıştı.
Yapıcı Fonksiyon otomatik çalıştı.
Yıkıcı Fonksiyon otomatik çalıştı.
Yıkıcı Fonksiyon otomatik çalıştı.
Yapıcı ve yıkıcı fonksiyonların hangi şartlarda çalıştığını örneklemeye çalıştım. Ek olarak yapıcı ve yıkıcı fonksiyonlar sınıf bloğu dışında (prototip olmak şartı ile) tanımlanabilir. Örnekleyelim;
C++:
#include "stdio.h"
class personel
{
private:
char name[20];
int yovmiye;
public:
personel();
~personel();
};
personel::personel()
{
printf("Yapıcı Fonksiyon otomatik çalıştı. \n");
}
personel::~personel()
{
printf("Yıkıcı Fonksiyon otomatik çalıştı. \n");
}
int main()
{
personel per1;
personel *per2= new personel();
delete per2;
}
Son düzenleme: