Bu yazımda C++’ın C programlama dilinden ayrıldığı başlıca nokta olan, hatta ortaya çıkısının en temel sebebi olan nesne yönelimli programlama konusuna giriş yapacağım.
Nesne Yönelimli Programlama ve Temel Özellikleri
Nesne yönelimli programlama C++’ın temelde ortaya çıkış sebeplerinden bir tanesidir. Programlamada da nesne temel olarak gerçek dünyada olduğu gibi tezahür edilebilir, Örneğin gerçek dünyada nasıl bir nesnenin dışarıdan bakıldığı zaman, yapısal olarak onu diğer nesnelerden ayıran özellikleri varsa, programlamada da nesnelerin o nesneyi diğer nesnelerden ayırmamızı sağlayan özellikleri vardır.
Sınıf işe herhangi bir nesneyi ele aldığımızda, o nesnenin nasıl olması gerektiği ve ne gibi özelliklerinin olduğu bilgisini sağlayan yapıdır. Bir programlama dilinin temel kullanım amaçlarından bir tanesi veriyi işlemek olduğu için, verilerin doğru bir şekilde sınıflandırılması programcıya büyük bir kolaylık sağlayacaktır. Sınıflar sayesinde veriyi daha iyi bir şekilde yönetebiliriz. Nesneler sınıflara göre üretilmektedir, yani bir sınıf yardımı ile ilgili nesnenin nasıl olması gerektiği bilgisine ulaşır ve o sınıfın özelliklerine bakarak, ilgili sınıfın özelliklerine sahip bir nesne oluşturabiliriz. Bu sayede ilgili nesneden bir tane daha oluşturmamız gerektiğinde nesnenin bütün özelliklerini tekrar tanımlamak yerine, ilgili sınıf yardımıyla istediğimiz özelliklerde benzer bir nesne daha tanımlayabiliriz. Aynı sınıf yardımıyla üretilmiş farklı nesneler bir birini etkilememektedir. Sınıfın içerisinde kullanıcıya bir takım seçenekler sunarak, kullanıcının aynı sınıf yardımı ile benzer özelliklerde farklı nesneler üretmesini de sağlayabiliriz.
Örneğin bir araba nesnesi tanımladığımızda, arabanın bir markasının, modelinin, motor hacminin, koltuk sayısının bulunduğu ve ulaşım için kullanıldığı bilgilerini bize veren yapı sınıftır, sınıfın içerisinde kullanıcıya bir takım seçenekler sunarak, kullanıcının aynı sınıf yardımı ile farklı bir araba üretmesi de sağlanabilir.
Nesne yönelimli programlamanın temel avantajları su şekilde sayılabilir:
- Gerçek hayatla ilişkilendirmesi kolaydır
- Bir nesneyi pek çok kez kullanabilirsiniz yeniden kullanılabilirliği yüksektir
- Problemlere müdahale etmek kolaydır
- İlgili proje üzerinde güncelleme yapmak kolaydır
- Güvenlidir
Sınıf ve Nesne Oluşturma
Sınıf oluştururken class ifadesini kullanırız ve açmış olduğumuz ana süslü parantezden sonra noktalı virgül koymamız gerekmektedir. Bu süslü parantez içerisindeki her ifade ilgili sınıfa aittir. Aşağıda basit bir örnek sınıf oluşturuluş modeli gösterilmiştir.
class sınıf_adı { sınıf içeriği };
Nesne oluştururken program içerisinde sınıf isminin yanına nesne adını yazarak ilgili nesneyi oluşturabiliriz. Nesne ismi + nokta + metot ismi, şeklinde bir kullanım ile nesnenin sınıf içerisindeki herhangi bir metodu kullanmasını sağlayabiliriz. Aşağıda basit bir örnek nesne oluşturuluş modeli ve nesnen ile metot kullanım modeli gösterilmiştir.
Sınıf_adı nesne_adı; // nesne oluşturuluşu Nesne_adı.metot_adı(); // nesne ile birlikte metot kullanımı
Aşağıda Basit bir sınıf oluşturma ve nesne oluşturma örneği verilmiş olup, konunun ilerleyen kısımlarında nesne yönelimli programlama hakkında daha fazla ayrıntıya değinilecektir. Bu örnekte ortalama isimli bir sınıf ve ortalama sınıfından öğrenci1, öğrenci2 ve öğrenci3 isimlerinde 3 nesne oluşturulmuştur.
#include <iostream>
class ortalama {
public:
int vize_p;
int final_p;
void not_gir() {
std::cout << "vize notu:";
std::cin >> vize_p;
std::cout << "final notu:";
std::cin >> final_p;
}
void ortalama_yaz() {
std::cout << "ortalama:";
std::cout << ((vize_p * 4) + (final_p * 6))/10;
}
};
void main() {
ortalama öğrenci1;
öğrenci1.not_gir();
öğrenci1.ortalama_yaz();
std::cout << std::endl;
ortalama öğrenci2;
öğrenci2.not_gir();
öğrenci2.ortalama_yaz();
std::cout << std::endl;
ortalama öğrenci3;
öğrenci3.not_gir();
öğrenci3.ortalama_yaz();
}
Yukarıdaki kodun örnek bir kullanımı aşağıda verilmiştir. vize notu:40
final notu:60
ortalama:52
vize notu:60
final notu:40
ortalama:48
vize notu:95
final notu:69
ortalama:79
Erişim Belirteçleri
Bu yapı nesne yönelimli programlamanın güvenliğini arttıran unsurlardan birisidir. Sınıf içerisinde iki nokta üst üste işareti ile birlikte kullandığımız ifadelerdir. Bu ifadeler ile sınıfın ilgili aralığının kulanım izinleri oluşturuluyormuş gibi düşünülebilir. İlgili ifadeler aşağıda verilmiştir.
Public: Sınıf içerisinde public olarak tanımlanan her şey o sınıftan oluşturulmuş bütün nesneler için kullanıma açıktır.
private: Sınıf içerisinde private olarak tanımlanan her şey sınıfın kullanıcıları için gizlenmiş olan kısım olarak düşünülebilir, kullanıcının erişimine kapalıdır. Mesela sınıf içerisinde private olarak tanımlanan herhangi bir özelliği oluşturulan nesne için private durumdayken çağıramazsınız.
Protected: yalnızca o sınıfın değişkene doğrudan erişimi olduğu anlamına gelir, diğer her şeyin bu verilere erişmek veya bunları değiştirmek için bir yönteme ihtiyacı vardır.
Yapıcı ve Yıkıcı Metotlar
Bir fonksiyon eğer sınıfın içerisinde yer alıyorsa, bu fonksiyonu metot olarak adlandırırız. Yapıcı metot sınıftan bir nesne oluşturulduğu zaman, yıkıcı metot işe sınıftan bir nesne kaldırıldığı zaman çalıştırılan metotlardır.
Yapıcı ve yıkıcı metotlar sınıf ismiyle aynı isme sahiptir. sınıf içerisinde sınıf isminin başına ~ yazarak yıkıcı metot oluşturabilirsiniz sadece sınıf ismini kullanırsanız yapıcı metot oluşturmuş olursunuz. ALTGR+Ü tuş kombinasyonu ile ~ işaretini yazabilirsiniz. Program nesneyi çağırdığınız süslü parantezin içerisinde işini bitirip dışarı çıktığı zaman otomatik olarak ilgili nesneyi kaldıracağı için Yıkıcı metot çalışacaktır. Eğer bir nesneyi new anahtar sözcüğü ile tanımlarsak, dinamik bellek kullanacağımız için nesne biz istemediğimiz sürece kaldırılmayacaktır. Yıkıcı metot da herhangi bir parametre gönderemezsiniz.
Yapıcı metot vasıtası ile sınıf içerisindeki değişkenlere varsayılan değerler atayabilirsiniz. Yapıcı metot da parametreler gönderebilirsiniz yani yapıcı metot birden fazla değişken alabilir ancak yapıcı metot da bir değişken girdi olarak verilirse ekstrandan boş bir yapıcı metot daha tanımlamamız gerekmektedir. Çok sayıda farklı işleve sahip farklı yapıda yapıcı metotlar da tanımlayabiliriz.
Aşağıdaki örnekte hesap_makinesi isminde bir sınıf ve hesap_makinesi sınıfından işlem1, işlem2, işlem3 isimlerinde üç nesne oluşturulmuştur. Örnek içerisinde üç adet yapıcı ve bir adet yıkıcı metoda yer verilmiştir. Bu örnekte böl metotunu private olarak tanımladığımız için nesneler bu özelliği kullanamayacaklardır.
#include <iostream>
class hesap_makinesi {
public:
int a;
int b;
// yapıcı metotlar
hesap_makinesi(std::string k) {
std::cout << k;
}
hesap_makinesi(std::string k,char d) {
std::cout << "\n" << k << " " << d;
}
hesap_makinesi() {
std::cout << "\n" << "Hesap:";
a = 1;
b = 8;
}
void değer() {
std::cout << "\n" << "a:";
std::cin >> a;
std::cout << "b:";
std::cin >> b;
}
void topla () {
std::cout << "Toplam:" << a + b;
}
void çıkar() {
std::cout << "\n" << "cikarma sonucu:" << a - b;
}
void çarp() {
std::cout << "carpim:" << a * b;
}
// yıkıcı metot
~hesap_makinesi() {
std::cout << "\n" << "nesne silindi.";
}
private:
void böl() {
std::cout << "bolme sonucu:" << a / b;
}
};
void main() {
hesap_makinesi işlem1("islem");
işlem1.değer();
işlem1.topla();
hesap_makinesi işlem2;
işlem2.çıkar();
hesap_makinesi işlem3("islem",'*');
işlem3.değer();
işlem3.çarp();
}
Yukarıdaki kodun örnek bir kullanımı aşağıda verilmiştir. islem
a:10
b:18
Toplam:28
Hesap:
cikarma sonucu:-7
islem *
a:18
b:10
carpim:180
nesne silindi.
nesne silindi.
nesne silindi.