2. BLM225
Nesneye Dayalı Programlama
2
Dersin Adı : Nesneye Dayalı Programlama
Bu dersi alan öğrenci Nesneye dayalı programlama kavramını ve altında yatan düşünce
mantığını analayacak, C++ dilini kullanarak Sınıf tanımlarını yapabilecek, Kendi
oluşturduğu Sınıfları, Mevcut Sınıfları ve Şablonları tekrar kullanarak Nesneye Yönelik
Programlar yazabilecektir.
Konular
Nesneye Dayalı Programlamaya giriş
C++ programlama dilinin Temelleri, Döngü ve Kararlar, Fonksiyonlar
Yapılar (Struct)
Sınıf (Class) yapısı, Kullanımı ve Özellikleri
Kurucu (constructor) ve Yokedici fonksiyonlar (destructor)
Nesnelerin fonksiyonlara parametre olarak gönderilmesi
Operatörlere yeni işlevlerin yüklenmesi (operator overloading)
Kalıtım (Inheritance)
Kalıtımın kurucu ve yok ediciler üzerindeki etkisi
Çoklu kalıtım (multiple inheritance)
Nesne işaretçileri (pointers to objects)
Çok Şekillilik (Polymorphism)
Sıra Dışı Durumlar (Exceptions)
Şablonlar (Templates)
Kaynaklar:
1. Object Oriented Programming in C++, Robert Lafore, Fourth Edition, Sams Publishing,
2002, (Kitabın türkçe çevirisi bulunmakta, Nesne Yönelimli C++ Programlama Kılavuzu,
Robert Lafore, Alfa yayınları)
2. C++ How to Program, Seventh edition, Harvey M. Deitel and Paul J. Deitel, Deitel &
Associates, Inc. 2010.(Kitabın türkçe çevirisi bulunmakta, C ve C++, Deitel & Deitel,
Sistem yayıncılık)
3. Thinking in C++ (Free Electronic Book), Bruce Eckel, 2nd ed., Vol. 1 and Vol.2,
Prentice-Hall, 2000 and 2003.
4. C++ ve Nesneye Yönelik Programlama, M. Erhan SARIDOĞAN, Papatya yayıncılık,
2004
5. C++ ile Nesne Tabanlı programlama, Bora GÜNGÖREN, Seçkin yayıncılık, 2001
İnternet Kaynakları
6. http://www.buzluca.com/cpp/notlar.html
7. http://www.functionx.com/cpp/
8. http://web.itu.edu.tr/~mscelebi/cpp/index.html
9. http://web.itu.edu.tr/~uyar/programlama/c.pdf
10. http://www.cplusplus.com/doc/tutorial/introduction/
11. http://sundog97.tripod.com/tutorial_cpp/index.html
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
2
3. BLM225
Nesneye Dayalı Programlama
3
1. Giriş
Programlama, Yaşadığımız gerçek dünyadaki problemlerin çözümlerinin bilgisayarda ifade
edilmesidir. Programcılar problemlerin çözümleri ile ilgili kavramları, varlıkları kullandıkları
programlama dili ile ifade ederler[1]. Programlama teknikleri şu şekilde sıralanabilir [7].
Yapısal olmayan programlama
Yapısal programlama
Nesne Yönelimli programlama
Görsel Programlama
Yapısal olmayan programlama
Bu yöntemde program bir tek ana program yer alır. Ana program ard arda gelen komut
dizilerinden oluşur. Altprogramlar ve bloklama yoktur. Ana program içinde kullanılan
komutlar global olarak tanımlanmış değişkenlere erişerek kullanırlar. Programlar büyüdükçe
tanımlanan değişkenlerin bozulması mümkün olabilmektedir. Ayrıca program için kullanılan
ve ard arda gelen komut dizilerini tekrar kullanmak gerektiğinde bu komut dizilerini tekrar
uygun yere kopyalayıp kullanmak gerekmektedir. Bu ise program boyunu gereksiz yere
uzatmaktadır. Programın okunabilirliğini, anlaşılabilirliğini azaltmakta ve hataları bulmayı
zorlaştırmaktadır.
Şekil 1. Yapısal olmayan programlama
Yapısal (structural) programlama
Procedural (işleve dayalı, altprogram kullanmaya dayalı) programlama olarak da ifade
edilebilir. Bu programlama yönteminde bloklar halinde program yazma ve altprogramların
kullanımı ön plana çıkmaktadır. Altprogram(procedure, subroutine) ve
Fonksiyonlar(Function) küçük farklarla benzer kavramları ifade etmektedirler. Her ikisi de
belirli bir amaca yönelik işlemleri yerine getiren program parçacıklarıdır. İhtiyac duyulan her
noktada ana program akışı içinde herhangi bir noktadan isimleri yazılarak defalarca çağrılıp
kullanılabilirler. Ana program sıralı bir şekilde değişik altprogramların çağrılıp kullanılması
ile oluşturulur. Ana programdan altprograma veri işlenmek üzere gönderilir. Altprogram bunu
işleyerek anaprograma tekrar geri dönderir. Altprogramlar bir kez hatasız bir şekilde
yazıldıktan sonra defalarca kullanılabilir. Bir hata oluştuğunda hatanın kaynağını bulmak daha
kolaydır. Programın anlaşılabilirliği, okunabilirliği daha yüksektir. Ancak Şekil 2’ de
görüldüğü gibi global verilere erişimde bir sınırlama getirilmemiştir. Veriler ve bu veriler
üzerinde işlem yapan fonksiyonlar ayrı ayrı düşünülmüştür. Verilerin bozulmasına karşı
herhangi bir önlem alınmadığından veri güvenliği yetersizdir. Bu yöntemde verilerden ziyade
fonksiyonlara ağırlık verilmektedir. Tasarım aşamasında ilk sorulan soru program ne iş
yapacak sorusudur.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
3
4. BLM225
Nesneye Dayalı Programlama
4
Şekil 2 Fonksiyonların Global değişkenlere erişimi
Nesneye Yönelimli programlama(NYP)
Nesne Yönelimli Programla yöntemi uzun ve karmaşık programlar geliştirmek için
tasarlanmıştır. Günümüzde bilgisayarda çözülmek istenen problemler eskiye oranla daha
karmaşık ve büyüktür. Programlar uzadıkça, problemi analiz etmek ve çözmek
zorlaşmaktadır. Donanım maliyetleri düşerken yazılım maliyeti artmaktadır.
Daha Güvenilir, dayanıklı, esnek, geliştirilebilir, Tekrar kullanılabilir ve daha kolay bakımı
yapılabilen kaliteli programlar yazabilmek için yazılım problemlerine Nesne Yönelimli
Analiz ile yaklaşmak daha fazla avantajlar sağlamaktadır. Şekil 1.5 de Nesne Yönelimli
yaklaşım görülmektedir.
NYP yönteminde veriler ve bu veriler üzerinde işlem yapan fonksiyonlar bir araya getirilerek
nesne (object) adı verilen bir yapı oluşturulmuştur. Nesneler birbirleri ile mesaj göndererek
haberleşebilirler. Her bir nesnenin verilerle ifade edilen Nitelikleri(özellikleri), ve
Fonksiyonlarla ifade edilen (Davranışları) bulunur. Veri ve fonksiyonların bir arada
bulunmasına Paketleme(Encaptulation) adı verilir. Verilerin diğer nesnelerden gizlenebilmesi
veya erişiminin kısıtlanması mümkündür. Buna veri gizleme(data hiding) denilmektedir.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
4
5. BLM225
Nesneye Dayalı Programlama
5
Şekil 3 Nesne yönelimli yaklaşım
Nesne yönelimli programlamada programları güncellemek veya yeni eklentiler yapmak daha
kolaydır. Nesne yönelimli programlama yönteminde sistem içinde bir çok nesne yer alır. Bu
nesneler birbirlerinden farklı özellikler taşıyabildikleri gibi aynı veya benzer özellikler de
taşıyabilirler. Nesneye dayalı programlamada tasarım yapılırken öncelikle veriler esas alınır.
Nesne Yönelimli programlamada Paketleme(Encaptulation), Soyutlama(Abstraction),
Türeme (Derivation), Miras alma veya Kalitim (Inheritence) gibi kavramlar yer almaktadır.
Neler nesne olarak modellenebilir.
Memur, müdür, Öğretmen, Öğrenci, ….
Nokta, Çizgi, Çember, Silindir, ….
Matris, Vektörler, Karmaşık sayı,…
Çerçeve, menü, Pencere,…
Nesneye dayalı yöntemin değerlendirilmesi.
Problemlerin çözümüne ilişkin daha gerçekçi bir model oluşturulabilir.
Oluşturulan bir nesne daha sonra defalarca tekrar kullanılabilir(reusability)
Programları güncellemek, hataları bulmak, bakımını yapmak daha kolaydır
Ekip çalışmaları için uygundur.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
5
6. BLM225
Nesneye Dayalı Programlama
6
1.2 C++ programlama dili
C++ Dilinin Tarihsel Gelişimi
C Programlama dili genel amaçlı orta seviyeli ve yapısal bir programlama dilidir. 1972
yılında Dennis Ritchie tarafından Bell Laboratuarında Unix işletim sistemi ile kullanılmak
için tasarlanmıştır. C, özellikle sistem programlamada sembolik makine dili (Asembly) göre
tercih edilmektedir. İşletim sistemleri, derleyiciler ve debug gibi aşağı seviyeli sistem
programlarının yazılımında yoğun olarak C programlama dili kullanılır.
C++ dili C diline bazı özelliklerin eklenmesi ile Bjarne Stroustroup tarafindan BELL
laboratuarlarında gelistirilmistir. 1983 ilk C++ derleyicisi sunulmuştur. 1998 ISO C++ dili
standartlari kabul edilmiştir.
Neden C++
-Daha iyi bir C dir. C dilinin bir üst kümesi olduğundan bu dilin hemen hemen bütün
özelliklerini destekler
-Veri Soyutlamasını destekler
-Nesne yönelimli programlamayı destekler
-Geliştirilebilir programlamayı destekler[1]
-Çok sayıda kaynak dokümana sahiptir
.
C++ İle Programlamaya Giriş
C++ programlama dilini öğrenmeye basit bir program yazarak başlayalım. Aşağıda
“Hello.cpp” olarak bilgisayara kaydedilen bir program görülmektedir.Bu program ekrana
“Hello World” Türkçesi “Merhaba Dünya” anlamına gelen kelimeleri yazmaktadır.
Şekil 2.1 Basit bir C++ programı
Programın ekran çıktısı şu şekildedir.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
6
// Hello.cpp
// Ekrana " Hello World” yazan program
#include <iostream>
using namespace std;
int main()
{
cout << " Hello Worldn";
getch();
return 0;
}
7. BLM225
Nesneye Dayalı Programlama
7
Programın açıklaması
C dilinde yazılan programları uzantısı “ .c” ve C++ dilinde yazılan programların uzantısı
“.cpp” dir.
"//" işareti açıklama(yorum) satırlarını ifade etmektedir. C++ derleyicisi bu işaretle başlayan
satırları dikkate almaz. Birden fazla satırı iptal etmek veya açıklama satırı olarak göstermek
için bunları da “/*” ve “*/” işaretleri arasına almak gerekir.
#include <iostream.h> satırı C++ da bulunan ve ismi belirtilerek istenilen kütüphane
dosyasını programa dahil etmek için kullanılmıştır. Burada <iostream.h> kütüphane dosyası
programa dahil edilmektedir. Bu dosya içinde cout ve cin komutları bulunmaktadır. Cout ve
cin komutlarını kullanabilmek için bu kutuphane dosyası programa dahil edilmek zorundadır.
“.h” ile biten dosyalar kütüphane dosyalarıdır. C++ da ki hazır kütüphanelerde bir çok hazır
fonksiyonlar vardır.
Her C++ programında mutlaka bir main() isimli ana fonksiyon yer almak zorundadır.
Program main() fonksiyonundan itibaren çaşlıştırılmaya başlanır. Main() fonksiyonunun
önünde yer alan “int” ifadesi main() fonksiyonunun dönüş tipini göstermektedir. Yani bu
fonksiyon geriye int(tamsayı) bir değer döndermektedir. Dolayısı ile “return 0” ifadesi ile
geriye 0 değeri dönderilmektedir. Cout komutu ekrana bir değeri veya cümleyi yazdırmak için
kullanılan bir komut(fonkiyon)dur.
C++ da ana fonksiyondan hemen sonra yer alan komutlar " { } " parantezleri arasına yazılır.
Önemli bir nokta ise C++ dilinde her komut " ; " ile bitmek zorundadır.
" Hello Worldn" cümlesinin sonunda yer alan " n " karakterleri imleci bir sonraki satıra
konumlandırmak için kullanılmaktadır. Bu şekilde kullanılan karekter sabitleri ve ne için
kullanıldıkları aşağıda görülmektedir.
Tanım
'0' NULL karakter
'a' çan sesi (alert)
'b' geri boşluk (back space)
't' tab karakteri (tab)
'n' aşağı satır (new line)
'v' düşey tab (vertical tab)
'f' sayfa ileri (form feed)
'r' satır başı (carriage return)
'"' çift tırnak (double quote)
'' ters bölü (back slash)
" n " karekter sabiti kullanmadan aşağıdaki komut da aynı işlevi görmektedir. “endl”
komutu bir alt satıra imleci konumlandırır.
cout << " Hello World"<<endl;
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
7
8. BLM225
Nesneye Dayalı Programlama
8
C++ dilinin genel yapısı aşağıda verilen örnek programla daha iyi anlaşılacaktır.
Şekil 2.2 Bir C++ programının yapısı
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
8
// Ornek1.cpp
// C++ da genel program yapısı.
#include <iostream>
#define pi 3.14;
const int max=10;
int a,b;
float ort;
int OrtalamaHesapla(int vize1, int final1)
{
float ortalama;
ortalama=vize1*0.4+final1*0.6;
return ortalama;
}
int main() // main fonksiyonundan program çalışmaya başlar
{
int vize;
int final;
std::cout << "Vize notunu giriniz :"; //Ekrana yaz
std::cin>>vize; //Klavyeden giriş
std::cout << "Final notunu giriniz :";
std::cin>>final;
ort=OrtalamaHesapla(vize,final);
std::cout << "Ortalama notu = "<<ort;
getch();
return 0; // programın başarılı bir şekilde
// sonlandığını belirtir.
} // main fonksiyonu sonu
Program başlığı
Program ile ilgili Açıklamalar
Kullanılan
kütüphane dosyaları
Global
Değişken ve sabitler
Programcının
Tanımladığı
“OrtalamaHesapla”
İsimli Fonksiyon
Yerel değişkenler
AnaProgramBloğu
Yerel değişken
9. BLM225
Nesneye Dayalı Programlama
9
Programın ekran çıktısı
Bir C++ programı sırası ile aşağıdaki bölümlerden oluşur.
Program başlığı, program ile ilgili açıklamalar
Kullanılan kütüphane dosyaları
Global değişken tanımları
Programcının tanımladığı fonksiyonlar
Main fonksiyonu ana program bloğu
Şimdi bu bölümleri kısaca açıklayalım.
Program başlığı, program ile ilgili açıklamalar
Bu kısımda yazılan program ile ilgili açıklamalar, programı kimin yazdığı, yazım tarihi, amacı
gibi açıklamalar yazılır. Yazımı zorunlu olmamakla birlikte tavsiye edilmektedir.
Kullanılan kütüphane dosyaları
Bu bölümde programda kullanılacak kütüphane dosyalarının isimleri yazılır.
Global değişken tanımları
Değişkenler
Programın içerisinde farklı değerler alabilen, değeri değiştirilebilen semboler değişken olarak
tanımlanır. Bu semboller aslında bilgisayar belleğinde verinin saklandığı yeri ifade ederler.
Dolayısı ile bu alana yerleştirilecek veri de sürekli olarak değişebilir. Değişkenleri global ve
yerel değişkenler olarak iki gruba ayırmak mümkündür.
Global değişkenler main() fonksiyonu dışında programın baş kısmında tanımlanan
değişkenlerdir. Bu değişkenler programcının tanımladığı tüm fonksiyonlar ve ana program
bloğu içinden erişilip kullanılabilir. Başka bir ifade ile programın her yerinde faaliyet
gösterebilen, geçerli olan değişkenlerdir. Birden fazla fonksiyon aynı isimli global değişkene
erişip kullanabilir.Bu durum program hatalarına neden olabilir.
Yerel değişkenler Bir fonksiyon içinde ya da bir program bloğu içinde tanımlanan
değişkenlerdir. Main() fonksiyonu içinde tanımlanan değişkenler de yerel değişkenlerdir.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
9
10. BLM225
Nesneye Dayalı Programlama
10
Değişkenler aşağıdaki şekilde tanımlanır.
[Veri Tipi] [Değişken Adı];
Örnek:
char c; int sayi; float f; double d; unsigned int k; string adsoy;
Veri Tipleri
Sayısal veri tipleri
Karakter veri tipi
Mantıksal veri tipi
String (Karakter dizisi) veri tipi
Sayısal veri tipleri(Tamsayı,Gerçek)
Tamsayi veri tipi (char, int, long)
Tamsayı değerler alırlar. Aşağıdaki tabloda tamsayı veri türleri görülmektedir.
TÜR İSMİ UZUNLUK(byte) SINIR DEĞERLERİ
char 1 -128 127
unsigned char 1 0 255
int 2 -32.768 32.767
unsigned int 2 0 65.535
long 4 -2.147.483.648 2.147.483.647
unsigned long 4 0 4.294.967.296
1. char tipi
Tamsayı değerler alır. 8 bit uzunluğundadır. Bellekte 1 bayt yer kaplar. -128 ile +127 arasında
değer alır. Unsigned : 0 ile 255 arasında değer alır.
2.int tipi
Tamsayı değerler alır. 16 bit uzunluğunda ifade edilirler. Bellekte 2 Bayt kaplarlar. -32768 ile
+32767 arasinda değer alır. unsigned: 0 ile 65535 arasinda değer alır.
Örnek: int i; i değişkeni tam sayı türündendir. 3, -7 gibi değerler alabilir.
3. Long tip.
Tamsayı değerler alır. 32 bit uzunluğundadır. -2147483648 ile +2177483647 arasinda değer
alır, unsigned: 0 ile 65535 arasinda değer alır.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
10
11. BLM225
Nesneye Dayalı Programlama
11
Gerçek Tipler (Float, Double)
Gerçek (noktalı, küsüratlı) sayıları içerirler.
float : Bellekte 4 Byte yer tutar. -3.4xE38 ile . +3.4xE38 aralığında değer alır. Hassasiyet
7-8 basamaktır.
double : Bellekte 8 Byte ter tutar. . -1.7xE308 ile . 1.7xE+308 aralığında değer alır.
Hassasiyet 15-16 basamaktır.
“
Karakter tipi (char)
Char: Tek bir karakter değer alır. '0’,’1’,’2’,... ' ‘a’, ‘8’ , ‘%’ , ‘+’ , ‘F’ gibi değerler
alır. Aynı zamanda 8 bit uzunluğunda tamsayı değerler de alabilir. Ancak bir harfi veya
klavyeden basılacak bir tuşu değer olarak bir değişkene atamak istenirse char olarak
tanımlanır.
Mantıksal veri tipi(Bool)
Bool: true(dogru) = 1 veya false(yanlis) = 0 değerini alır. Eski derleyiciler bu türü
desteklemeyebilir. Yeni ANSI C++ standardında eklenmiştir.
String (Karakter dizisi) veri tipi
Bir ismi veya bir cümleyi bir değişkene atamak gerekirse bu değişken string olarak
tanımlanır. Örnek: “ali”, “bu gün hava güzel” gibi değerlerbu değişkene atanabilir. String
veri tipini kullanabilmek için
#include <string>
kütüphane dosyasının programa eklenmesi gerekmektedir.
Değişkenlere ilk değerleri tanımlandıkları anda da verilebilir.
Örnekler:
int a=5;
float f=3.14;
string adsoy=”Ali Demir”;
bool onay=true;
char ch=’A’;
int a=5;
float f=3.14;
string adsoy="Ali Demir";
bool onay=false;
char ch='A';
cout<<ch<<endl;
cout<<a<<" "<<f<<" "<<adsoy<<endl;
if (onay==!true)
cout<<"tamamdir";
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
11
12. BLM225
Nesneye Dayalı Programlama
12
else
cout<< "sorun var";
Operatörler
Bir değişkene değer atamak, bir işlem yapmak veya iki değişkeni karşılaştırmak gibi
işlemler yapmak için kullanılan ‘=’, ‘+’, ‘>’ gibi sembollerdir.
C++ da kullanılan Operatörleri öncelikle türlerine göre şu şekildedir.
1) Aritmetiksel operatörler + , - , * , / , % , ++ , --
2) Karşılaştırma operatörleri < , > , <=, >= , ==, !=
3) Atama operatörleri = , += , -=, *= , /= , %= , <=, >>=, &=, != , ^=
4) Mantıksal Operatörler ! , || , &&
5) Bit bazında işlem yapan operatörler & , | , ^ , ~
Şekil 2.3 de operatörlerin kullanımı ile ilgili bir örnek program verilmiştir. Bu programda
atama “=”, çarpma “*” ve toplama”+” ile karşılaştırma “>=”, “<” operatöreleri
kullanılmıştır.
Artırma ve Azaltma operatörleri
“++” artırma operatörüdür. “--“ azaltma operatörüdür. Önünde veya sonunda bulunduğu
değişkenin değerini bir artırmak veya azaltmak için kullanılır.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
12
//Vize ve final notlarinindan geçme notunu hesaplama
#include <iostream>
#include <conio.h>
int main()
{
int vize, final;
double ort;
vize = 43; //atama operatörü
final = 80;
ort = vize * 0.4 + final * 0.6; //Çarpma ve toplama operatörü
std::cout<< "Gecme notunuz: " << ort;
if(ort>=65) std::cout<<"nGectiniz n"; //Karşılaştırma operatörü
if(ort<65) std::cout<<"nKaldinizn";
getch();
return 0;
// artırazalt.cpp
// x i bir arttırıp y yi bir azaltarak çarpar
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
main()
{
int x = 4;
int y = 8;
cout << "x = " <<x << endl;
cout << "y = " << y << endl;
cout <<"++x * --y = " << ++x * --y ;
getch();
return 0;
}
13. BLM225
Nesneye Dayalı Programlama
13
Programın ekran çıktısı
" endl " komutu satır sonunu belirterek yeni satıra geçmemizi sağlar, bir nevi "n "
sembolü gibi bir işleve sahiptir.
Seviye Operatör Tanım
Öncelik Yönü
(associativity)
1 :: Kapsam(scope)
( ) öncelik kazandırma ve fonksiyon çağırma soldan sağa
[ ] indis operatörü (subscript)
. yapı elemanına ulaşım (structure access)
-> yapı elemanına gösterici ile ulaşım
2 + işaret operatörü (unary) sağdan sola
- işaret operatörü (unary)
++ 1 artırma (increment)
-- 1 eksiltme (decrement)
~ bitsel değil (bitwise not)
! mantıksal değil (logical not)
* içerik operatörü (indirection)
& adres operatörü (address of)
sizeof sizeof operatörü
3 * çarpma (multiplication) soldan sağa
/ bölme (division)
% modulus (bölümden kalan)
4 + toplama (addition) soldan sağa
- çıkarma (suntraction)
5 << bitsel sola kaydırma (bitwise shift left) soldan sağa
>> bitsel saga kaydırma (bitwise shift right)
6 < küçüktür (less than) soldan sağa
> büyüktür (greater than)
<= küçük eşittir (less than or equal)
>= büyük eşittir (greater than or equal)
7 = = eşittir (equal) soldan sağa
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
13
14. BLM225
Nesneye Dayalı Programlama
14
!= eşit değildir (not equal to)
8 & bitsel VE (bitwise AND) soldan sağa
9 ^ bitsel EXOR (bitwise EXOR) soldan sağa
10 | bitsel VEYA (bitwise OR) soldan sağa
11 && mantıksal VE (logical AND) soldan sağa
12 || mantıksal VEYA (logical OR) soldan sağa
13 ?: koşul operatörü (conditional operator) sağdan sola
14 = atama (assignement) sağdan sola
+= işlemli atama (assignment addition)
-= işlemli atama (assignment subtraction)
*= işlemli atama (assignment multiplication)
/= işlemli atama (assignment division)
%= işlemli atama (assignment modulus)
<<= işlemli atama (assignment shift left)
>>= işlemli atama (assignment shift right)
&= işlemli atama (assignment bitwise AND)
|= işlemli atama (assignment bitwise OR)
^= işlemli atama (assignment bitwise EXOR)
15 , virgül operatörü (comma)
Operatörlerin öncelik sıralarına göre aşağıda verilen işlemi inceleyelim.
*,/, % operatörleri aynı önceliğe sahip olmalarına karşın, öncelik sırası soldan sağa doğru
olduğundan Öncelikle p*r işlemi, daha sonra şekle göre 2 numaralı işlem(%) daha sonra
bölme işlemi şeklinde verilen sırada işlemler gerçekleştirilecektir.
Bir başka örnek işlem sırasını inceleyin
Program Kontrol ve Döngü Komutları
if Komutu
Belirli bir şarta bağlı olarak bir işlem veya işlemlerin yapılmasını sağlamak amacı ile
kullanılan karşılalştırma komutudur.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
14
if (şart)
{
Komut1;
Komut2;
...
}
if ( şart )
{
komut1;
komut2;
...
}
else
{
komut1;
komut2;
...
}
15. BLM225
Nesneye Dayalı Programlama
15
Şeklinde bir kullanıma sahiptir. Örnek olarak notu 50 den büyük ise ekrana Geçtiniz
yazan if komutu aşağıda gösterildiği gibidir.
if ( not >= 50 ) cout << "Geçtiniz!";
Notu 50 den buyuk ve 70 den kuçuk ise ekrana iyi değilse zayıf yazan if komutu aşağıdaki
gibidir.
if ( not > 50 && not <70)
cout << "iyi!";
else
cout << "zayıf!";
Switch-case Komutları
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
15
//pozitif.cpp
main()
{
int x;
cout << "Bir sayı girin:" ;
cin>> x;
if ( x > 0 )
cout << "n Pozitif" ;
else
cout<< “n negatif”
return 0;
}
16. BLM225
Nesneye Dayalı Programlama
16
Switch Case deyimi bir çeşit if komutu gibidir. Kontrol değişkeninin aldığı değere göre
istenen komutları işlemeye yarar. işlev bakımından if deyimine çok benzemektedir.
Değişken değeri sabit1’e eşit ise komut1, . Değişken değeri sabit2’e
Eşit ise komut2 vb. İşlem görür. Hicbir komut işlem görmemiş ise default ifadesi
altındaki komutlar işlem görecektir.
switch( Kontrol Değişkeni )
{
case Sabit1 : komut1; break;
case Sabit2 : komut2; break;
.
.
.
default : Komut;
}
switch örneği if-else eşdeğeri
#include <iostream>
using namespace std;
int main()
{
int x;
cout<< " Bir sayı giriniz:";
cin>>x;
switch (x) {
case 1:
cout << "x değeri 1";
break;
case 2:
cout << "x değeri 2";
break;
default:
cout << "x 1 ve 2 den farkli ";
}
return 0;
}
.
.
.
int x;
cout<< " Bir sayı giriniz:";
cin>>x;
if (x == 1) {
cout << "x değeri 1";
}
else if (x == 2) {
cout << "x değeri 2";
}
else {
cout << "x 1 ve 2 den farklı ";
}
.
.
.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
16
17. BLM225
Nesneye Dayalı Programlama
17
Döngü Komutları
Bir ya da birden fazla komutun istenen sayıda veya belirli bir şart gerçekleşinceye kadar
çalıştırılması istenirse döngü komutlarından yararlanılır.
For döngüsü,
while döngüsü,
do-while döngüsü
C++ da kullanılan döngülerdir.
For döngüsü
İşlemin kaç defa tekrar edeceği önceden belli ise for döngüsü kullanılır.
for (baslangıc; bitiş şartı; artım) Komutlar;
örnek: 1 den 100 e kadar olan for dongusu şu şekilde yazılmalıdır.
for (j=0; j<100; j++) Komutlar;
For döngüsü için aşağıdaki örnekleri inceleyiniz.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
17
//toplam.cpp
//for döngüsüyle 1 den 100 e kadar
// sayıların toplamını bulan program.
#include <iostream>
int main()
{
int top;
top=0;
for (int j=1; j<=100; j++)
{
top=top+j;
}
cout<<"toplam = "<< top;
return 0;
}
//factoriyel.cpp
//for döngüsüyle faktöriyel hesap.
#include <iostream>
int main()
{
int fak, sayi;
cout<<"Sayıyı giriniz: ";
cin>>sayi;
fak=1;
for (int j=1; j<=sayi; j++)
{
fak=fak*j;
}
cout<<"Sonuc: "<< fak;
return 0;
}
18. BLM225
Nesneye Dayalı Programlama
18
While ve do-while döngüsü
While döngüsü, döngü sayısının belli olmadığı zamanlarda kullanılır.Aşağıa verildiği
şekilde kullanılır.
While döngüsü, parantez içinde verilen şart doğru olduğu sürece altındaki komut veya
komut bloğu yürütülür. Eğer yanlış ise kontrol bir sonraki komut veya komut bloğuna
geçer. do-while döngüsünün while döngüsünden farkı döngünün devam edebilmesi için
gerekli olan şart kontrolünün döngü bloğunun sonunda yapılmasıdır. Dolayısı ile döngü
şart yanlış olsa bile bir defa icra edilecektir.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
18
// whileornek.cpp
// Klavyeden girilen sayıya kadar olan
//sayıları toplar
#include <iostream>
main()
{
int x, y;
y= 0;
cout<< " Bir Sayı Giriniz : ";
cin>>x;
while (x>0)
{
y =y+x;
x--;
}
cout<< "Toplam= "<< y;
return 0;
}
// do-whileornek.cpp
// Klavyeden girilen sayıya kadar olan
//sayıları toplar
#include <iostream>
main()
{
int x, y;
y= 0;
cout<< " Bir Sayı Giriniz : ";
cin>>x;
do
{
y =y+x;
x--;
} while (x>0);
cout<< "Toplam= "<< y;
return 0;
}
Do
{
Komut
Komut
Komut
.
Arttırım/azaltım
}while( Şart );
while( Şart )
{
Komut
Komut
.
Arttırım/azaltım
}
19. BLM225
Nesneye Dayalı Programlama
19
Break ve continue Komutu
Döngülerden herhangi bir noktada çıkılmak istenirse break komutu kullanılır. Örneğin x
değeri 5 olduğunda döngüden çıkmak istenirse if(x==5) break; komutu kullanılabilir.
Break komutu for döngüsü dahil bütün döngülerden çıkmayı sağlar. Bu durumda program
akışı döngü bloğunun sonundan devam eder.
while(1) { }, for(;;) { } döngüleri sonsuz döngüyü ifade eder. Sonsuz döngüden
break komutu ile çıkılır.
Continue komutu bir döngü içinde çalıştırılırsa, o döngü içinde bulunan tur sona erer
ancak döngü devam eder. Diğer bir deyişle, gövdenin içinde bulunan continue
komutundan sonra gelen cümleleri atlayarak, döngüyü devam ettirir.
Aşağıdaki örnekte ilk programda x=6 olduğunda döngüden tamamen çıkılmaktadır. İkinci
programda x=3 olduğunda döngü bir sonraki adımdan devam etmektedir. x=3 olduğu
andaki değeri ekrana yazılmayacaktır.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
19
//break komutunun kullanımı
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
main()
{
for (int x = 1; x <= 20; x++) {
if (x == 6) break;
cout<< x << " ";
}
getch();
return 0;
}
//continue komutunun kullanımı
#include <iostream>
main()
{
for(int x=0; x <= 9; x++)
{
if(x ==3) continue;
cout<< x<< “ “;
}
}
20. BLM225
Nesneye Dayalı Programlama
20
Diziler ve Pointerler
Bellekte ardışık bir biçimde bulunan ve aynı türden verilerin oluşturduğu veri yapısına dizi
(array) denir. Diziler hafızada bir yer kaplarlar. Programcı, her elemanın tipini ve dizide kaç
eleman kullanacağını belirterek bilgisayarın en uygun hafızayı ayırmasını sağlar. Dizi boyutu
başlangıçta belirtildikten sonra bellekte dizinin eleman sayısı kadar sıralı olarak yer ayrılır.
Dizi boyutu daha sonra program içinde çalışma anında tekrar değiştirilmez. Bu yüzden gerekli
olduğunda çalışma hatası ile karşılaşmamak için dizi boyutu aşılıp aşılmadığı kontrol
edilmelidir. Dizi tanımlaması şu şekilde yapılır.
Veri tipi Dizi ismi [dizi boyutu];
Örnek 10 elemanlı tamsayı türünde A isimli bir dizi tanılmamak istediğimizde aşağıda verilen
tanımlamayı yapmak gerekmektedir.
int A[10];
float x[100], y[50], z[10]; //x 100 elamanlı, y 50 elemanlı z 10 elemanlı bir dizi
#define BOYUT 100
int dizi[BOYUT]; // 100 elemanlı bir dizi
a[n] şeklinde tanımlanan bir dizinin ilk elemanı a[0] ve son elemanı a[n-1] dir.
Aşağıda verilen for döngüsü dizi içeriğini sıfırlamaktadır.
for (i = 0; i < BOYUT; ++i)
dizi[i]=0; //Dizinin bütün elemanlarını sıfırlar
dizi[5]=78; // dizinin 5. elemanına 78 değeri atanmaktadır.
Dizilere tanımlandıkları anda ilk değerleri de verilebilir.
Örnekler:
double sample[5] = {1.3, 2.5, 3.5, 5.8, 6.0};
double sample[] = {1.3, 2.5, 3.5, 5.8, 6.0};
char str[4] = {‘d’, ‘i’, ‘z’, ‘i’};
unsigned veri[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
20
21. BLM225
Nesneye Dayalı Programlama
21
Dizilere yukarıdaki gibi ilk değer verildiğinde, verilen değerler dizinin ilk elemanından
başlayarak dizi elemanlarına sırayla atanmış olur.
Dizilerin tüm elemanlarına ilk değer verme zorunluluğu yoktur. Dizinin eleman sayısından
daha az sayıda elemana ilk değer verilmesi durumunda kalan elemanlara otomatik olarak 0
değeri atanmış olur.
int a[20] = {0}; //yalnızca dizinin ilk elemanına 0 değeri vermekle derleyici dizinin kalan
elemanlarına otomatik olarak 0 değeri atayacaktır.
dizi elemanlarına ilk değer verme işleminde dizi uzunluğu belirtilmeyebilir, bu durumda
derleyici dizi uzunluğunu verilen ilk değerleri sayarak kendi hesaplar ve dizinin o uzunlukta
açıldığını kabul eder. Örneğin :
int sample[] = {1, 2, 3, 4, 5};
derleyici yukarıdaki ifadeyi gördüğünde sample dizisinin 5 elemanlı olduğunu kabul
edecektir.
başka örnekler :
char isim[ ] = {‘S’, ‘a’, ‘l’, ‘i’, ‘h’, ‘0’};
unsigned short count[ ] = {23, 4, 8, 7, 8, 9, 12, 75, 13, 45};
derleyici isim dizisinin uzunluğunu 6, count dizisinin uzunluğunu ise 10 olarak varsayacaktır.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
21
//Dizi kullanımı
#include <iostream>
int main( )
{
int n[10]={32, 27, 64, 18, 95, 14, 90, 70, 60, 37};
cout<< "Eleman Degerin";
for (int i = 0; i <= 9 ;i++)
cout<< i<<" "<<n[i]<<endl;
getch();
return 0;
}
22. BLM225
Nesneye Dayalı Programlama
22
Dizileri Fonksiyonlara giriş olarak göndermek için dizinin ismini parantez kullanmadan
belirtilir. Genellikle Diziler fonksiyonlara geçirilirken boyutları da geçirilir.
int myDizi[ 24 ];
myFunction( myDizi, 24 );
Göstericiler (İşaretçiler-Pointers)
İşaretçi, bellek alanındaki herhangi bir gözün adresinin saklandığı değişkenlerdir. İşaretçiler
verileri değil o verilerin bulunduğu yerlerin bellek adreslerini tutarlar. Tüm işaretçilerin
bellekte kapladığı alan int boyutundadır. Her değişken bellekte yer kapladığına göre belirli bir
adrese sahiptir. Değişkenlerin adresleri, derleyici ve işletim sistemi tarafından ortaklaşa
olarak belirlenir. Nesnelerin adresleri program yüklenmeden önce kesin olarak bilinemez ve
programcı tarafından da önceden tespit edilemez. Programcı, nesnelerin adreslerini ancak
programın çalışması sırasında (run time) öğrenebilir. Örneğin:
char ch=’A’; //ASCII kodu belleğe yerleşir 65
int b=0x45;
long f=0x12345678; //Hexadesimal değer f değişkenine atanıyor
biçiminde bir tanımlamayla karşılaşan derleyici bellekte ch değişkeni için 1 byte, b değişkeni
için 2 byte ve f değişkeni için 4 byte yer ayıracaktır. Program çalıştırılarak belleğe
yüklenmeden derleyicinin ch değişkeni için bellekte hangi adresi ayıracağını önceden bilmek
mümkün değildir. Bu durum b ve f değişkenleri içinde geçerlidir.. Bu ancak programın
çalışması sırasında öğrenilebilir. Aşağıda verilen çizimde değişkenler için ayrılan adresler ve
içerikleri görülmektedir.
Adres İçeriği
1A00 ?
ch 1A01 65
1A02 ?
b 1A03 45
1A04 00
1A05 ?
f 1A06 78
1A07 56
1A08 34
1A09 12
1A0A ?
1A0B ?
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
22
23. BLM225
Nesneye Dayalı Programlama
23
1A0C ?
1A0D ?
Göstericiler program içinde tanımlanmış diğer değişkenlerin adreslerini tutan değişkenlerdir.
Değişkenlerin adreslerini tutmak ve adreslerle ilgili işlemler yapmak için kullanılır.
Göstericilerin içlerinde adres bilgileri bulunur. Bu nedenle gösterici ile adres hemen hemen eş
anlamlı olarak düşünülebilir. Tüm göstericilerin bellekte kapladığı alan int boyutundadır
Gösterici bildirimlerinin genel biçimi şöyledir:
Veri tipi * gösterici ismi;
Örnek :
float *f; //f değişkeni float türünden bir değişkenin adresini tutacak
char *s; //s değişkeni char türünden bir değişkenin adresini tutacak
int *dizi; //dizi değişkeni int türünden bir değişkenin adresini tutacak
göstericilerle ilgili işlem yaparken kullanılan operatörler şu şekildedir.
& ya da adres operatörü, operandının adresini döndüren bir tekli operatördür.
* operatörü hem gösterici tanımlanırken kullanılır. hemde göstericinin tuttuğu(sakladığı, buna
gösterdiği de denilebilir) adresin içindeki değere ulaşmak için kullanılır. Bu yüzden içerik
operatörü olarak ta söylenmektedir.
Örneğin,
Aşağıda tanımlanan değişkenlerin yukarda verilen şekle göre işlemleri şu şekildedir.
char ch=’A’; //ASCII kodu belleğe yerleşir 65
int b=45;
long f=0x12345678; //Hexadesimal değer f değişkenine atanıyor
aşağıdaki şekilde tanımlanan pointer değişkenlerle ilgili olarak,
char *p1;
int *p2;
long *p3;
p1=&ch; //p1=1A01 olur
p2=&b; //p2=1A03 olur
p3=&f; //p3=1A06 olur
işlemleri yapıldıktan sonra
char c1;
int c2;
long c3;
c1=*p1; //c1=65
c2=*p2; //c2=45
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
23
24. BLM225
Nesneye Dayalı Programlama
24
c3=*p3; //c3=0x12345678
olur
#include <iostream.h>
#include <iostream>
using namespace std;
int main( )
{
int a,b;
int *p1,*p2;
a=10;
b=20;
p1=&a; // a değişkeninin ram deki
//adresini p1(pointer) değişkeninin içine ata
p2=&b; //
cout<<*p1<<endl; // p1 pointerının
içindeki //adreste bulunan değeri ekranda
gösterir
cout<<*p2<<endl;
getch();
return 0;
}
0x11 0x13
a b
----- ------ p1 p2
10 -------- --------
20
0x11
Ox13
#include <conio.h>
#include <iostream.h>
#include <iostream>
using namespace std;
int main( )
{
int a,b;
int *p1,*p2;
p1=&a;
p2=&b;
a=10;
b=20;
cout<<a<<endl;
cout<<b<<endl;
cout<<&a<<endl;
cout<<&b<<endl;
cout<<p1<<endl;
cout<<p2<<endl;
cout<<*p1<<endl;
cout<<*p2<<endl;
getch();
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
24
25. BLM225
Nesneye Dayalı Programlama
25
return 0;
}
int main() {
int *p1; //no initialization.
// int a;
// p1=&a;
*p1 = 3; //Possible segfault.
cout<<*p1<<endl;
getch();
}
#include <conio.h>
#include <iostream.h>
#include <iostream>
#include <string>
using namespace std;
struct A {
virtual void f() {
cout << "A::f();n";
}
};
int main() {
A* a = new A();
delete a;
a->f(); //Could cause a segfault.
getch();
}
void rcv()
{
int b;
int *x = 0;
x=&b;
*x = 3;
}
int main()
{
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
25
26. BLM225
Nesneye Dayalı Programlama
26
cout<<rcv();
getch();
return 0;
}
int rcv()
{
int b;
int *x = 0;
x=&b;
*x = 3;
return *x;
}
int main()
{
cout<<rcv();
getch();
return 0;
}
Gösterici Aritmetiği
Bazen göstericinin işaret etttiği adresten ileri ya da geri gitmek gerekebilir.
int *a;
float *b;;
char *c;
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
26
27. BLM225
Nesneye Dayalı Programlama
27
a++ denildiğinde a nın değeri int tipli bir değişkeni işaret ettiğinden int değişkenin belllekte
kapladığı alan (2) kadar artar. Benzer olarak b++ denildiğinde b’nin değeri 4 artacaktır.
Karabük Üniversitesi Uzaktan Eğitim Araştırma ve Uygulama Merkezi
Mühendislik Fakültesi No: 215 Balıklarkayası Mevkii 78050 Karabük TÜRKİYE
27
// Göstericiler * ve & operatörünü kullanmak
#include <iostream>
int main()
{
int a;
int *aPtr; //aPTr bir tamsayı göstericisi
a = 7;
aPtr = &a; // a değiskeninin adresi aPtr ye atanıyor.
cout << "a nin adresi : " << &a
<< "n aPtr degeri : " << aPtr;
cout << "nn a nin degeri : " << a
<< "n *aPtr nin degeri " << *aPtr;
cout << "nn &*aPtr = " << &*aPtr // *ve & ikisi birlikte kullanımı
<< "n *&aPtr = " << *&aPtr << endl; // yerleri fark etmez
return 0;
}