C++'da Nesneye yönelik (object-oriented ) programlama 1- sınıflar(class)

Bu makaleyi okuyanlar yapısal programlamayı bildiği kabul edilerek, hazırlanmıştır.

Bir çoğumuz özellikle C programlama dilinde yapılar (struct) kullanmıştır. Hepimizin bildiği üzere yapılar, bir birinle ilişkili verileri bir arada tuttuğumuz , veri türüdür. Ancak burada bir problem vardır. Bir sturct içindeki üye verileri (data members) , her kez tarafından ulaşılabilirdir. Bir örnek vermek gerekirse, traktörlerin hızını tutacağımız program için struct tanımlayalım. Günümüz şartlarında en iyi traktör bile 100 km hızla gidemez. Bizim programımızı kullanan kötü niyetli birisi tarafından 100 Km/h değerini girmek isteyebilir ve bizim üye verilerimiz (data members) , her kez tarafından ulaşabildiği için programımızın statik düzenli işleyişi bozulacaktır ve gereksiz, hatalı veriler işlenecekdir.

Struct veri türünün keşif edilmesinden sonra, program dili geliştiricilerinin bu struct veri türünün yetersiz olduğu kanısına vararak ortaya yeni bir class adında veri türü yarattılar. Peki Class veri türü nedir ?, Class ile gelen Üye fonksiyon (method), Üye veriler (data members), Nesneler (objects) nedir ?

Class kavramına girmeden önce, günlük hayatımızda ki bir işleyiş üzerinden class , object , method'un ne olduğundan bahsedelim. Arabalar , class'lar için mükemmel bir örnektir. Arabaya kullanmadan önce. Muhakkak ki , birsi onu tasarlayıp ve inşa etmek zorundadır. Genellikle bir mühendis çizimlerinde arabaların hızını arttırmak için bir gaz kolu tasarlar. Bu gaz pedalının arkasında sürücünün fark etmediği "gizli" kompleks yapıda bir mekanik işlem görülmektedir. Arabaları detaylı incelediğimizde gaz pedalı gibi aynı kompleks yapıda fren pedalı , direksiyon, el freni, vites gibi bir çok düzeni görmekteyiz. Ancak, sürücüler az bir mekanik bilgisi yada hiç bir bilgisi olmadan kolayca araç kullanabilirler. Bu örneğe göre, Arabanın bir class olduğunu , gaz pedalının bir method olduğu ve arabanın iç konseptini nesne olduğunun kanısına varabiliriz.

C++'da programımıza bir sınıf eklemek istiyorsak class diyerek , onu programımıza dahil ederiz. Bir sınıfa ait fonksiyona ise, üye fonksiyon (member fonksiyon) denir. Bir sınıf bize, bir ve birden fazla üye fonksiyon kullanmamıza izin verir. Tıpkı gaz, fren , debriyaj fonksiyonları gibi. Sınıfları kullanmak içinde mutlaka, bir object (nesne) yaratmalıyız. Mesela, arabayı kullanırken gaz pedalına daha sert bastığımızda. Metal aksam, kompleks yapıya mesaj iletir. Kompleks yapıda, motora ve böylece, arabanın hızını artırmış oluruz. Benzer bir şekilde sınıfın objectsine, bir mesaj gönderdiğimizde, Üye fonksiyon çağırılır ve bize istediğimiz işlevi yerine getir. Bu olay " requesting a service from an object(nesneden servis istedeği)" diye adlandırılır. Programımızda kullanacağımız class aynı arabadaki bir çok üyelere sahip olabilirler.

Unutmayalım ki, sınıflarda integer (int) gibi bir veri türüdür. C++ ve bir çok object - oriented programlama dillerinde dinamik yapıya sahiplerdir. Nesneler ise hem niteliklere (veri türlerine) hemde davranışlara (üye fonksiyonlara-method) sahiptir.

C++'da class tanımlanması :

Class zaman
{
veri türleri , üye fonsiyonlar bu alana yazılır
};
Nesnenin yapısı


Sınıftan nesne üretmek
Class zaman
{
veri türleri , üye fonsiyonlar
};

zaman oylezamanı ;// oylezamanı adılı zaman türünden bir obje yarattık
zaman array[5]; // zaman türünden dizi nesnesi
zaman *ptr ; // zaman objesine pointer atatık

Veri üyeler : Bir nesne, programda kullandığı gibi taşınan niteliklere sahiptir ve bu nitelikler obje yaşadığı sürece devam eder. Normal bir sınıf , sınıfın objelerine ait niteliklerini işleyebilecek, üye fonksiyonlardan oluşmaktadır. Nitelikler ise bir sınıf içinde değişkenler olarak tanımlanır. Bir değişken sınıf tanımı içinde tanımlanması zorunludur. Ama, üye fonksiyonlar dışarıda tanımlanabilir. Sınıfın bütün örnekleri, sınıfın veri üyelerinin bir kopyasından oluşmaktadır. Bir değişkeni veri üyesi olarak yaratmanın yararı ; Sınıfın bütün üye fonksiyonları , Sınıf tanımı içersin de ki , her hangi bir görünür veri üyelerini işleyebilir.
Class zaman
{
public:
Void
setzaman (int x,intu); // üye fonksiyon
Void zamanıyaz();
int saat ;
int dakika ;
};

zaman sınıfımız saat ve dakika şeklinde 2 veri üyesinden, setzaman ve zamanyaz şeklinde 2 üye fonksiyondan oluşmaktadır.

Düşündünüz ve dediniz ki ; bu yapı struct'ın gelişmişi. Evet şimdilik bu düşünce doğrudur. Ancak bir yere kadar. Public'in türkçe anlamı halk demektir. Yani burada public diyerek halka açık diye düşüne bilirisiniz. Şimdi public , private, protected kavramı üzerinde tartışalım.

public : bu bir tanımdır ve class içerisinde ki tüm veri üyelerine ve methodlarına dışardan ulaşabilir.
private : Bu tanım ise sınıfın tüm üyelerine dışardan ulaşılmayı engeller.
protect : Bu tanımı ise inherintance işlerken detaylı bahsedeceğim, şimdilik private olarak bilinse yeterli.

Private nerede kullanılır ? İlk başta anlattığımız traktör olayını hatırlayınız . Eğer biz orada struct yerine, sınıf kullanmış olsaydık. hız veri üyesini private yapardık ve bir üye fonksiyon ile gelen veri kontrol ettirir. Doğru ise private olan hız değişkenine yazdırırdık.

class traktor
{
Public :
void
Sethız("int x")
{
if (x>0||x<50)
x=gercekhız;
else
cout<<"hatalı değer";
}
private :
int gercekhız;
};

int main ()
{
traktor hızal;
traktor hızaliki;
hızal.Sethız(100) ;// Bu kod üye veriye ulaşılamıyacaktır.
hızaliki.Sethız(30); // bu kod ile hızaliki nesnesinin üyeverisi 30 eşit olacaktır
hızal.gercekhız; // gercek hız değişkenine ulaşamayacaktır ve hatta complie etmiyecektir.
hızal.gercekhız; // gercek hız değişkenine ulaşamayacaktır ve hatta complie etmiyecektir.
return 0;
}
C
lass içersinde herhangi bir tanım vermeseydik eğer public,private,proctect gibi. Derleyici onu private olarak algıyacaktı.
class traktor
{
int gercekhız; // private olarak algıladı ve sınıf dışından şu an ulaşılmaz
};

Sınıfların method tanımı :
Methodlar bilindiği üzere sınıf içerisinde tanımlanmış üye fonksiyonlardı. Ancak biz bu sınıfların içinde tanımlaya bildiğimiz gibi sınıf dışında
class traktor
{
Public :
void
Sethız("int x");
private :
int gercekhız;
};
void
traktor: void Sethız("int x")
{
if (x>0||x<50)
x=gercekhız;
else
cout<<"hatalı değer";
}

Constructors
Constructors Türkçeye yapıcı fonksiyonlar diye adlandırıldığına şahit olmuş olabilirsiniz. Ancak ben ve bir çok yazılım sektöründe olan kişiler constructors ifadesini kullanmayı tercih ederiz. Constructor'lar, sınıf içinde tanımlanan bir method'dur. Sınıfın içinde sınıfın adı ile tanımlanır. En büyük özelliği ise hiç birşey return etmezler ve void fonksiyondan farklıdır. Üye değişkenler tanımlaya bilir yada onları değiştirebilir. genellikle public olarak tanımlanır. Eğer ki bir sınıfa açıkça constructors yazılmadı ise , Complier onu , defualt consturctor (parametresiz) olarak complie eder. Yada siz defualt constructors eklemek istiyorsanız. Constructor'a argüment yazmayınız.

constructors örneği:

class traktor
{
public:
// constructor
traktor () { gercekhız = 30; }
private:
int
gercekhız;
};

Deconsturctor
Türkçeye yıkıcı olarak geçse de, biz yinede deconsturctor ifadesini kullanıyoruz. Biz bir consturactor yazdığımda , önce ram'den complier class için yer ayırıyor, sonrada constractor için malloc ediyor. İşlem bittiğinde yaratılan constructor , deconstrutcer'i otomatik olarak çagırıyor. ramden malloc ettiği yeri ayırabilmesi için. Object nerede yaradılırsa yaradılsın. Object nerede yıkılırsa, Deconstructor'da oraya çağrılır ve bir constructor asla argument ve return type taşımaz. ve consturctor'ın önüne ~ yazılarakta çagrılabilir.


class traktor
{
public:
// constructor
traktor () { gercekhız = 30; }
// deconstructor
~traktor();

private:
int
gercekhız;
};

Bu makalede Object - Oriented yönelik class tanımına giriş yaptık . Unutmayın ki uygulayarak geliştirebilirsiniz. Bir sonraki makalemde inheritance kavramını tarştışacağım;
  • Beğen
İfadeler: 1 kişi

Yorumlar

Gösterilecek yorum bulunamadı.

Blog girdisi detayları

Ekleyen
byanigli
Okuma süresi
4 dakika okuma
Görüntüleme
1.553
Son güncelleme

Genel kategorisindeki diğer girdiler

byanigli adlı kullanıcının diğer girdileri

Bu girdiyi paylaş

Geri
Yukarı