Nesneye Yönelik Programlama (5. Sunu)
Nesneye Yönelik Programlama (Object Oriented Programming – OOP)
Temel Kavramlar Nesneye Yönelik Programlama (Object-Oriented Design-OOD) (Sadece int, double yeterli mi?) Sınıf (Class)(Kullanıcı Tanımlı Veri Tipi) (User-defined Data Type) ( Deniz a;) Üye Değişkenler (Data Members) (Attributes) Üye Fonksiyonlar (Member Functions) (Behaviors) Nesne (Object) (Bir fabrikada üretilen aynı otomobiller) İçerik Gizleme (Information Hiding) Tanım (Definition-header file) ve Uygulama (Implementation) Dosyalarının Birbirinden Ayrılması Yapıcılar (Constructors) Yıkıcılar (Destructors)
Temel Kavramlar Üyelere Ulaşım Belirteçleri (Member Access Specifiers) (public ve private) Üyelere Ulaşım Operatörleri (Member Access Operators) (nokta – dot (.) ve ok – arrow (->) Operatörleri) #ifndef, #define ve #endif Önişlemci Direktifleri Kapsam Belirleme Operatörü (Scope Resolution Operator, ::)
3 Dosyaya İhtiyaç Var Zaman.h Zaman.cpp Yurutucu.cpp Başlık (Header) Dosyası veya Sınıfın Tanım Dosyası (Definition-Declaration) #include "Zaman.h" Sınıfın Uygulama Dosyası (Implementation) #include "Zaman.h" İçerisinde main fonksiyonu bulunan ve sınıfın nesnelerinin kullanılabildiği veya sınıfın test edildiği işletme dosyası Zamanı Bir Sınıf Olarak Nasıl Temsil Edebiliriz?
Tanım Dosyası (Definition) Zaman.h Tanım dosyası içerisinde private üye değişkenlerin deklarasyonu ile public/private üye fonksiyonların prototipleri yer alır. Tanım Dosyası (Definition) ifndef, define ve endif önişlemci direktifleri Zaman Sınıfı tanımının projenin birden fazla dosyası içerisinde kullanımının nesne kodu (object code) bünyesinde tekrarını engeller. #ifndef ZAMAN_H #define ZAMAN_H class Zaman { public: Zaman();//Yapıcı (Constructor) void ZamaniAyarla(int,int,int );//saat,dakika,saniye void ZamaniYazdir(); private: int saat; //0-23 int dakika;//0-59 int saniye;//0-59 };//; 'e DİKKAT!!!!!!!!! #endif
Uygulama Dosyası (Implementation) Zaman.cpp Uygulama Dosyası (Implementation) Uygulama dosyası içerisinde public/private üye fonksiyonların tanımları (yapıcılar ve yıkıcılar dahil) yer alır. Üye değişkenler uygulama dosyası içerisinde global bir kapsama sahiptirler. #include "Zaman.h" #include <iostream>//cout #include <iomanip> //setfill ve setw using namespace std; //Zaman Sınıfının Yapıcısı Sınıfın Her Bir Üye Değişkeninin //İlk Değerini Sıfır Olarak Ayarlar. Böylece Sınıfın Bütün //Nesneleri Belirli Bir İlk Duruma Sahip Olurlar. Zaman::Zaman()//::Kapsam Belirleme Operatörü { saat=dakika=saniye=0; } void Zaman::ZamaniAyarla(int h,int m,int s) saat=(h>=0 && h<24) ? h : 0; //Saati Doğrula dakika=(m>=0 && m<60) ? m : 0;//Dakikayı Doğrula saniye=(s>=0 && s<60) ? s : 0;//Saniyeyi Doğrula //Zamanı HH:MM:SS Formatında Ekrana Yazdır void Zaman::ZamaniYazdir() cout<<setfill('0')<<setw(2)<<saat<<":" <<setw(2)<<dakika<<":"<<setw(2)<<saniye<<endl; cout<<setfill('x')<<setw(10)<<77<<endl; xxxxxxxx77
İçinde main Olan ve Sınıfın Nesnesinin Kullanıldığı, Sınıfın Test Edildiği Dosya Yurutucu.cpp #include "Zaman.h" #include <iostream>//cout ve endl using namespace std; int main() { //Zaman Sınıfının Varsayılan (Default) Yapıcısı Çağrılır Zaman z; //z Nesnesinin Üye Değişkenlerinin İlk Değerlerini Yazdır cout<<"Baslangic Zamani: "; z.ZamaniYazdir();//00:00:00 z.ZamaniAyarla(13,27,6);//Zamanı Değiştir cout<<"Yeni Zaman: "; z.ZamaniYazdir();//13:27:06 z.ZamaniAyarla(99,99,99);//Geçersiz Değerlerle Zaman Ayarı cout<<"Gecersiz Zaman: "; return 0; }
Microsoft Visual Studio programının intellisense özelliğine dikkat ediniz.
Herhangi Bir Müşteriye Ait Bir Banka Hesabını Bir Sınıf Kullanarak Nasıl Temsil Edersiniz? Hangi Üye Değişkenleri ve Üye Fonksiyonları Kullanırsınız?
Tanımlanan “Sınıf” lar Nasıl Kullanılırlar Tanımlanan “Sınıf” lar Nasıl Kullanılırlar? (Bir Sınıfın Nesnesi Nasıl Oluşturulur?) Zaman Sınıfı Örneği Zaman gunBatimi; Zaman dizi[5]; Zaman *zamanPtr=&gunBatimi;
Sınıf Aidiyet Kavramı ve Üyelere Erişim Bir sınıfın faaliyet alanında (sıkopunda): Üye Değişkenler - Nitelikler (Data Members) Sınıf tanımında (definition) deklare edilen değişkenlerdir. Üye Fonksiyonlar - Davranışlar (Member Functions) Sınıf tanımında (definition) deklare edilen ve “üye değişkenler” i manipule etmek için kullanılan fonksiyonlardır. Bu fonksiyonların tanımı .cpp dosyası içerisinde verilir.
Sınıf Aidiyet Kavramı ve Üyelere Erişim (Devam) Bir sınıfın faaliyet alanı içerisinde “Üye Değişkenler” bütün üye fonksiyonların erişimine açıktır. Bir sınıfın nesneleri sınıfın bütün public üye değişkenlerine ve public üye fonksiyonlarına kısıtlamasız erişebilirler. Bir sınıfın nesneleri sınıfın private üye değişkenlerine ve üye fonksiyonlarına ERİŞEMEZLER. private üye değişkenlerine ve private üye fonksiyonlarına sadece sınıf içerisinden ulaşılabilir.
private bir Üye Fonksiyon Olabilir mi? Cevap: Evet. Bu tür fonksiyonlara yardımcı fonksiyonlar (helper or utility functions) denir ve public üye fonksiyonların işlerini kolaylaştırmak için kullanılırlar. Böyle bir fonksiyona sınıfın nesneleri ulaşamazlar.
Nokta (Dot) Üyelere Erişim Operatorü (.) Sınıf Aidiyet Kavramı ve Üyelere Erişim (Devam) Nokta (Dot) Üyelere Erişim Operatorü (.) Bir nesnenin, ait olduğu sınıfın public üyelerine ulaşabilmesine imkan tanır. Ok (Arrow) Üyelere Erişim Operatorü (->) Bir nesneye işaret eden pointer ın, ait olduğu sınıfın public üyelerine ulaşabilmesine imkan tanır.
Programların modifiye edilmesini kolaylaştırır. Sınıf Tanımının (Definition) ve Uygulamasının (Implementation) Birbirinden Ayrılması (İçerik Gizleme – Information Hiding) Programların modifiye edilmesini kolaylaştırır. Uygulama dosyasında yapılan herhangi bir değişiklik sınıfın arayüzü (interface) değişmediği müddetçe sınıf kullanıcısını etkilemez.
Programlama Pratiği Bir sınıfın kullanıcıları sınıfın uygulama dosyasındaki kodu bilmek zorunda değildirler. Bununla birlikte bu sınıfı kullanabilmek için sınıfın object code una (yani uygulama dosyasının derlenmiş versiyonuna) ulaşabilmelidirler. Bu sayede bağımsız yazılım firmaları sınıf kütüphaneleri yazıp satabilirler. Bu tür firmalar sadece sınıfın başlık (header) dosyasını ve object modüllerini kullanıcıya verirler.
Yapıcı (Constructor) Sınıf ile aynı ada sahip, sınıfın üye değişkenlerine belirli bir ilk değer atamak için kullanılan ve geriye hiçbir değer döndürmeyen özel bir üye fonksiyonudur. Bir sınıf birden fazla yapıcıya sahip olabilir. (Fonksiyonların Aşırı Yüklenmesi?) Kendilerine hiçbir argüman almayan yapıcılar varsayılan (default) yapıcılar olarak adlandırılırlar.
Yıkıcı (Destructor) Özel bir üye fonksiyonudur. Sınıf ile aynı ada sahiptir ama isminin önünde tilda karakteri (~) bulunur. Örneğin : ~Zaman Bir nesne kapsam dışına çıktığında yok edilir ve bu işlemi perde arkasından yapan (dolaylı) yıkıcıdır. Yıkıcılar hiçbir argüman almazlar ve geriye hiçbir şey döndürmezler. (void bile kullanılmaz.) Bir sınıf sadece bir yıkıcıya sahip olabilir. Eğer kullanıcı bir yıkıcı tanımlamazsa derleyici boş bir yıkıcı tanımlar.
Uygulama Yapıcısı 2 integer parametre kullanan MatematikselIslemler adında bir C++ sınıfı oluşturunuz ve bu sınıfın bir nesnesini main içerisinde deklare ediniz. Sınıfın bu nesnesi, yapıcısına aktaracağı integer parametreleri yine main içerisinde kullanıcıdan klavye aracılığıyla temin etmelidir. MatematikselIslemler sınıfının public tanımlayacağınız EkokuYazdir ve EbobuYazdir adındaki üye fonksiyonları ise, sırasıyla sınıfa yapıcı vasıtasıyla aktarılan integer sayıların en küçük ortak katını ve en büyük ortak bölenini bularak ekrana yazdıran parametresiz iki void fonksiyon olmalıdır.
MatematikselIslemler.h #ifndef MATEMATIKSELISLEMLER_H #define MATEMATIKSELISLEMLER_H class MatematikselIslemler { public: MatematikselIslemler(int,int);//İki Parametreli Yapıcı void EkokuYazdir();//Prototip void EbobuYazdir();//Prototip private: int sayi1;//1. Yapıcı Parametresini Saklayacak Üye Değişken int sayi2;//2. Yapıcı Parametresini Saklayacak Üye Değişken //private Tanımlı Yardımcı (Helper-Utility) Fonksiyonlar //(Sınıf Nesneleri Ulaşamaz) int EkokuHesapla(); int EbobuHesapla(); }; #endif
MatematikselIslemler.cpp #include "MatematikselIslemler.h" #include <iostream> //cout ve endl #include <cmath> //max ve min using namespace std; //2 Parametreli Yapıcının Tanımı MatematikselIslemler::MatematikselIslemler(int s1,int s2) { sayi1=s1; sayi2=s2; } void MatematikselIslemler::EkokuYazdir() //ekok Lokal Bir Değişken.sayi1 ve sayi2 Üye Değişkenler //Üye Değişkenler Uygulama Dosyası İçerisinde Globaldirler. int ekok=EkokuHesapla();//private Yardımcı Fonksiyon cout<<sayi1<<" ile "<<sayi2<<" nin EKOK u: "<<ekok<<endl; int MatematikselIslemler::EkokuHesapla() int maksimum=(int)max((double)sayi1,(double)sayi2); int i=maksimum; for(;i<=sayi1*sayi2;i++) if((i%sayi1)==0 && (i%sayi2)==0) break; return i; void MatematikselIslemler::EbobuYazdir() int ebob=EbobuHesapla();//private Yardımcı Fonksiyon cout<<sayi1<<" ile "<<sayi2<<" nin EBOB u: "<<ebob<<endl; int MatematikselIslemler::EbobuHesapla() int minimum=(int)min((double)sayi1,(double)sayi2); int i=minimum; for(;i>=1;i--) if((sayi1%i)==0 && (sayi2%i)==0)
MatematikselIslemler.cpp
Yurutucu.cpp #include "MatematikselIslemler.h" #include <iostream>//cout using namespace std; int main() { int sayi1,sayi2; cout<<"Iki Tamsayi Giriniz: "; cin>>sayi1>>sayi2; MatematikselIslemler islem(sayi1,sayi2); islem.EkokuYazdir(); islem.EbobuYazdir(); return 0; }