2006 PearsonEducation, Inc. All rights reserved.
1
3
Sınıflara ve
Nesnelere Giriş
2.
2006 PearsonEducation, Inc. All rights reserved.
2
3.1 Giriş
3.2 Sınıflar, Nesneler, Üye fonksiyonları ve data üyeler
3.3 Bu bölümdeki örnekler
3.4 Üye fonksiyonlu bir sınıfın tanımlanması
3.5 Parametreli bir üye fonksiyonun tanımlanması
3.6 Data Üyeler, set Fonksiyonları and get Fonksiyonları
3.7 Yapılandırıcılarla nesnelere ilk değer verilmesi
3.8 Bir sınıfı tekrar kullanmak için ayrı bir dosyaya yüklemek
3.9 Arabirimi uygulamadan ayırmak (Separating Interface
from Implementation )
3.10 set fonksiyonuyla Data değerini değiştirmek
3.
2006 PearsonEducation, Inc. All rights reserved.
3
3.1 Giriş
• Bölüm 2 deki programlarda tüm komutlar main
fonksiyonunun içindedir. Genellikle böyle
değildir.
• Tipik bir program main fonksiyon ve bir veya
daha fazla sınıf’dan oluşur. Her sınıf data üyeler
ve üye fonksiyonlardan oluşur
4.
2006 PearsonEducation, Inc. All rights reserved.
4
3.2 Sınıflar, Nesneler, Üye fonksiyonlar ve
Data üyeler
• Sınıflar:
• Örnek: Araba
– Fonksiyonlar bir görevi olan mekanizmaları tarif eder.
Vites gibi
• Karmaşık işler kullanıcıdan gizlenir. Ör. Kullanıcı arabayı
hareket ettiriken pedala basmak zorundadır ama arabanın
çalışma mekanizmasını bilmesi gerekmez.
– Sınıflar kullanılmadan önce tanımlanmalıdır. Araba
çalıştırılmadan önce imal edilmelidir.
– Bir sınıfdan bir çok araba nesnesi üretilebilir, mühendisin
çizdiği bir plandan bir çok araba üretilebildiği gibi.
5.
2006 PearsonEducation, Inc. All rights reserved.
5
3.2 Sınıflar, Nesneler, Üye fonksiyonlar ve
Data üyeler
• Araba örneğinde,
– Üye fonksiyonu çağırmak nesneye işlem yapması için
bir mesaj gönderir. Gaz pedalına basmak arabaya
hareket etmesi için bir mesaj gönderir.
– Nesnelerin olduğu gibi arabaların da nitelikleri
vardır. Renk ve gidilen mesafe gibi
6.
2006 PearsonEducation, Inc. All rights reserved.
6
3.3 Bu bölümdeki örnekler
• Yedi basit örnek
– GradeBook sınıfını oluşturacak örnekler
• İçinde kullanılanlar:
– Üye fonksiyonlar
– Data üyeler
– Sınıfı kullananlar
• Bu sınıfın nesnelerinin üye fonksiyonlarını çağıran diğer sınıflar
veya fonksiyonlar.
– Uygulama ile arabirimi ayırmak
– Data tanımlama
• Bir nesnedeki data özel bir formatta ve arlıkta olmak zorundadır.
7.
2006 PearsonEducation, Inc. All rights reserved.
7
3.4 Üye fonksiyonu olan bir sınıf
tanımlama
• Sınıf tanımlama
– Derleyiciye sınıfa ait hangi üye fonksiyonlar ve data üyeler
olduğunu bildirmektir.
– class anahtar kelimesinin ardından sınıf adı yazılır.
– Bir sınıfın gözdesi küme parantrezleri içinde kalır ({})
• Data üyeleri ve üye fonksiyonları belirler
• public:
– Üye fonksiyon veya data üyesinin, diğer fonksiyonlar ve
başka sınıflara ait üye fonksiyonlar tarafından
erişilebilir olduğunu gösterir.
8.
2006 PearsonEducation,
Inc. All rights reserved.
81 // Fig. 3.1: fig03_01.cpp
2 // displayMessage üye fonksiyonu olan GradeBook sınıfının tanımlanması;
3 // Bir GradeBook nesnesi oluşturup displayMessage fonksiyonunun çağırılması.
4 #include <iostream>
5 using std::cout;
6 using std::endl;
7
8 // GradeBook sınıf tanımlaması
9 class GradeBook
10 {
11 public:
12 // GradeBook kullanıcısına ‘hoşgeldin’ mesajı yazan üye fonksiyonu
13 void mesajYaz()
14 {
15 cout << " Grade Book hosgeldiniz!" << endl;
16 } // displayMessage fonksiyonunun
17 }; // GradeBook sınıfının sonu
18
19 // main fonksiyonuyla program çalışmaya başlıyor
20 int main()
21 {
22 GradeBook notDefterim; // myGradeBook adında GradeBook nesnesi oluşturalım
23 notDefterim.displayMessage(); // nesnenin displayMessage fonksiyonunu çağırması
24 return 0;
25 } // main sonu
Welcome to the Grade Book!
GradeBook sınıfının
tanımının başlangıcı
Sınıf gövdesinin
başlangıcı
Sınıf gövdesinin
sonu
public erişim kelimesi üyeleri
herkese açık hale geitirir.
mesajYaz üye fonksiyonu hiç bir
şey döndürmez.
GradeBook sınıfının üye
fonksiyonunu kullanmak için
nokta kullanılır.
9.
2006 PearsonEducation, Inc. All rights reserved.
9
3.4 Üye fonksiyonu olan bir sınıf
tanımlama
• Üye bir fonksiyonun tanımlanması
• void displayMessage()
• {
– Fonksiyonun döndürme tipi
• Fonksiyon görevini tamamladığında döndüreceği değerin tipini
gösterir.
• void fonksiyonun hiç bir şey döndürmediğini gösterir.
– Fonksiyon adı kurallara uygun yazılmalıdır. (Değişkenlere
benzer)
– Fonksiyon adından sonra gelen parantezler, bunun bir fonksiyon
olduğunu gösterir.
– Fonksiyonun gövdesi, o fonksiyonun görevini yapması için
gereken komutları içerir.
• {} küme parantezleri içine yazılır.
•
10.
2006 PearsonEducation, Inc. All rights reserved.
10
Genel hatalar 3.2
Döndürme tipi void olan bir fonksiyonun bir
değer döndürmesi derleyici hatası verir.
11.
2006 PearsonEducation, Inc. All rights reserved.
11
Genel hatalar 3.3
Bir fonksiyonun içinde başka bir fonksiyon
tanımlamak hatadır.
12.
2006 PearsonEducation, Inc. All rights reserved.
12
3.4 Üye fonksiyonu olan bir sınıf
tanımlama
• Sınıf kullanma
– Programcının tanımladığı bir sınıf
• Nesne oluşturmak için kullanılabilir
– O sınıfın tipinde değişkenler gibi tanımlanırlar
• kullanılarak C++ dili genişletilebilir.
– Nokta operatörü (.)
• Nesnenin data üyelerine ve üye fonksiyonlarına erişmek için
kullanılır.
• Örnek
– myGradeBook.displayMessage()
• GradeBook nesnesi myGradeBook,
displayMessage() üye fonksiyonunu çağırıyor.
13.
2006 PearsonEducation, Inc. All rights reserved.
13
Fig.3.2 | UML sınıf diyagramı GradeBook sınıfının public displayMessage operasyonu
var.
14.
2006 PearsonEducation, Inc. All rights reserved.
14
3.4 Üye fonksiyonu olan bir sınıf
tanımlama
• UML sınıf diyagramı
– 3 bölmeli bir dikdörtgendir.
• En üst bölmeye sınıfın adı yazılır.
• Orta bölmeye sınıfın nitelikleri yazılır.
• En alt bölmeye sınıfın operasyonları yazılır.
– Operasyonun önündeki + işareti operasyonun public
olduğunu gösterir.
15.
2006 PearsonEducation, Inc. All rights reserved.
15
3.5 Parametreli bir üye fonksiyonun
tanımlanması
• Fonksiyon parametreleri
– Fonksiyonun görevini yapması için gereken bilgidir.
• Fonksiyonun argümanları
– Her fonksiyon parametresine karşılık, çağırma sırasında
gönderilen değerlerdir.
• Argüman değerleri fonksiyonun parametresine kopyalanır.
16.
2006 PearsonEducation, Inc. All rights reserved.
16
3.5 Parametreli bir üye fonksiyonun
tanımlanması
• string
– Karakter dizisi demektir
– String olarak tanımlanmış bir değişken aslında C++
kütüphanesinin string sınıfının bir nesnesidir.
std::string
• <string> öncü dosya olarak tanımlanmıştır.
•getline kütüphane fonksiyonu
– input olarak gelen bilgileri return tuşuna basılana kadar
alır.
– Örneğin
• getline( cin, nameOfCourse );
– Standart girişten bir satır okur ve okuduğu bilgiyi, bir
string nesnesi olan nameOfCourse a yazar.
17.
2006 PearsonEducation,
Inc. All rights reserved.
17
Outline
fig03_03.cpp
(1 of 2)
1 // Fig. 3.3: fig03_03.cpp
2
3
4 #include <iostream>
5 using std::cout;
6 using std::cin;
7 using std::endl;
8
9 #include <string> // C++ standard string sınıfı kullanılıyor
10 using std::string;
11 using std::getline;
12
13 // GradeBook sınıfı
14 class GradeBook
15 {
16 public:
17 // GradeBook kullanıcısına hosgeldin mesajı yazan fonksiyon
18 void mesajYaz( string dersAdi )
19 {
20 cout << dersAdi << " dersine hosgeldiniz !n"<< endl;
21
22 } // fonksiyonun sonu
23 }; // GradeBook sınıfının sonu
24
25
26 int main()
27 {
28 string ders; // dersin adını tutan değişken
29 GradeBook notDefterim; // notDefterim adında bir GradeBook nesnesi oluşturmak
30
string sınıfının dahil edilmesi
Üye fonksiyonun
parametresi
Fonksiyon
parametresinin
değişken olarak
kullanılması
18.
2006 PearsonEducation,
Inc. All rights reserved.
18
Outline
fig03_03.cpp
(2 of 2)
31 // dersin adını kullanıcının girmesi için mesaj
32 cout << "lütfen dersin adını giriniz :" << endl;
33 getline( cin, ders ); // dersin adının okunması
34 cout << endl;
35
36// mesajYaz ın çağırılması ve ders değişkeninin argüman olarak gönderilmesi
37
38 notDefterim.mesajYaz( ders );
39 return 0;
40 }
lütfen dersin adını giriniz :
Bilm 219 C++ Programlama
Bilm 219 C++ Programlama dersine hosgeldiniz !
Üye fonksiyona bir
argüman göndermek
19.
2006 PearsonEducation, Inc. All rights reserved.
19
3.5 Parametreli bir üye fonksiyonun
tanımlanması
• Parametre Listesi
– Fonksiyon tarafından istenen bilgi
– Fonksiyon adından hemen sonra gelen parantezler içine
yazılır.
– Fonksiyonun herhangi bir sayıda parametresi olabilir.
• Parametreler arasına virgül konur.
– Fonksiyon çağırılırken argümanların sayı, sıra ve tipleri
fonksiyonun tanımındaki sayı, sıra ve tiple aynı olmalıdır.
– UML ile modellenir.
• Üye fonksiyonun parantezleri içinde; parametre adı, iki
nokta üstüste ve parametrenin tipi bulunur.
20.
2006 PearsonEducation, Inc. All rights reserved.
20
Genel hatalar 3.4
Fonksiyon tanımındaki parantez kapandıktan
hemen sonra noktalı virgül konması yazılım
hatası verir.
21.
2006 PearsonEducation, Inc. All rights reserved.
21
Genel hatalar 3.5
Fonksiyon parametresini fonksiyonun içinde
tekrar değişken olarak tanımlamak derleyici
hatası verir.
22.
2006 PearsonEducation, Inc. All rights reserved.
22
İyi programcı uygulaması 3.1
Belirsizliği ortadan kaldırmak için,
fonksiyonu tanımlarken kullandığınız
parametre adlarının aynısını fonksiyonu
çağırırken kullanmayın .
23.
2006 PearsonEducation, Inc. All rights reserved.
23
İyi programcı uygulaması 3.2
Fonksiyona ve değişkene görevine uygun isim
verilirse, programı sonradan anlamak kolay olur
(Programın okunabilirliği artar.) Aynı zamanda
fazla açıklama satırı koymak gerekmez.
24.
2006 PearsonEducation, Inc. All rights reserved.
24
Fig.3.4 displayMessage() fonksiyonu string tipinde ve courseName adında bir
parametre alıyor.
25.
2006 PearsonEducation, Inc. All rights reserved.
25
3.6 Data üyeler, set Fonksiyonları ve get
Fonksiyonları
• Yerel değişken
– Değişkenler fonksiyonun gövdesinde tanımlanır
• Fonksiyonun dışında kullanılmazlar.
– Bir fonksiyon bittiğinde
• Yerel değişkenlerin değerleri yok olur.
• Nitelikler (attributes)
– Nesnenin yaşamı boyunca var olurlar.
– Data üye olarak gösterirler
• Sınıf tanımındaki değişkenler
– Sınıfın her nesnesi niteliklerin kendi kopyasını tutar.
26.
2006 PearsonEducation,
Inc. All rights reserved.
26
Outline
fig03_05.cpp
(1 of 3)
1 // Fig. 3.5: fig03_05.cpp
2 // courseName’i data üye olarak tutan GradeBook
3 // sınıfının set ve get fonksiyonları
4 // set ve get fonksiyonları data üyeyi değiştirmek ve okumak için kullanılır.
5 #include <iostream>
6 using std::cout;
7 using std::cin;
8 using std::endl;
9
10 #include <string> // C++ standard string sınıfı
11 using std::string;
12 using std::getline;
13
14
15 class GradeBook
16 {
17 public:
18 // dersin adına değer atayan fonksiyon
19 void setDersAdi( string isim)
20 {
21 dersAdi = isim ;
22 }
23
24 // dersin adını döndüren fonksiyon
25 string getDersAdi()
26 {
27 return dersAdi;
28 }
29
set fonksiyonu private data ‘ya
değer atar
get fonksiyonu private datayı
döndürür.
27.
2006 PearsonEducation,
Inc. All rights reserved.
27
Outline
fig03_05.cpp
(2 of 3)
30
31 void mesajYaz()
32 {
33 // Dersin adının gerektiği bölümde getdersAdi çağırılır
34
35 cout << getDersAdi() << " dersine hosgeldiniz !n" << endl;
36
37 }
38 private:
39 string dersAdi;
40 };
41
42
43 int main()
44 {
45 string ders; // ders adını kaydetmek için karakter dizisi
46 GradeBook notDefterim; // notDefterim adında bir GradeBook nesnesi oluşturur
47
48 // ders’in ilk değerini gösterir
49 cout << "Dersin ilk ismi : " << notDefterim.getDersAdi()
50 << endl;
51
Set ve get fonksiyonları
sınıfın içinde bile kullanılır
Sınıf tanımlasının dışından private data’ya
erişim
private üyelere sadece sınıfın
üye fonksiyonları tarafından
erişilebilir.
28.
2006 PearsonEducation,
Inc. All rights reserved.
28
Outline
fig03_05.cpp
(3 of 3)
52 // ders adının kullanıcıdan alınması
53 cout << "n Lutfen ders adini giriniz:" << endl;
54 getline( cin, ders );
55 notDefterim.setDersAdi( ders ); //ders adının değiştirilmesi
56
57 cout << endl;
58 notDefterim.mesajYaz(); // yeni ders adının gösterilmesi
59 return 0;
60 } // main’in sonu
Dersin ilk ismi :
Lutfen ders adini giriniz:
Bilm 219 C++ Programlama
Bilm 219 C++ Programlama dersine hosgeldiniz !
private data’nın sınıfın dışında değiştirilmesi
29.
2006 PearsonEducation, Inc. All rights reserved.
29
İyi programlama örneği 3.3
Üye fonksiyonların tanımlamaları arasına
birer boş satır koyunuz. Bu programın
okunabilirliğini arttırır.
30.
2006 PearsonEducation, Inc. All rights reserved.
30
3.6 Data üyeler, set Fonksiyonları ve get
Fonksiyonları
•private
– Kendisinden sonra gelen data üyeye sadece o sınıfın üye
fonksiyonlarının erişmesini sağlar.
– Sınıf üyelerinin varsayılan erişimi private’dır
– Data gizleme
• Fonksiyonun değer döndürmesi
– Bir fonksiyonun void’ den başka bir return tipi varsa
• Kendisini çağıran fonksiyona bir değer döndürür.
31.
2006 PearsonEducation, Inc. All rights reserved.
31
Yazılım mühendisliği ipucu 3.1
Genel kural olarak, data üyeler private ve
üye fonksiyonlar public tanımlanır. (Eğer
sadece üye fonksiyonların çağırması gereken
fonksiyonlar olursa, bunlar private,
tanımlanır.)
32.
2006 PearsonEducation, Inc. All rights reserved.
32
Genel hatalar 3.6
Bir fonksiyon üyesi olmadığı bir sınıfın private
üyesine ulaşmaya çalışırsa derleme hatası olur.
33.
2006 PearsonEducation, Inc. All rights reserved.
33
İyi programlama örneği 3.5
Bir sınıfı tanımlarken önce private üyeleri
listeleyip private belirteci (varsayılan olmasına
rağmen) kullanılırsa, programın açıklığı artar.
34.
2006 PearsonEducation, Inc. All rights reserved.
34
Genel Hatalar 3.7
Değer döndürmesi gereken fonksiyonun değer
döndürmemesi derleme hatasına sebep olur.
35.
2006 PearsonEducation, Inc. All rights reserved.
35
3.6 Data üyeler, set Fonksiyonları ve get
Fonksiyonları
• set ve get fonksiyonları
– public üye fonksiyonlardır. private data üyelere
erişmeyi sağlarlar.
– set fonksiyonları bazen değiştirici olarak ve get
fonksiyonları da bazen erişim fonksiyonu olarak
adlandırılır.
– Programcının yazdığı sınıfın private data üyesine erişim
kontrolunu sağlamasına yardım eder.
– Aynı sınıfın diğer üye fonksiyonları tarafından da
çağırılabilirler.
36.
2006 PearsonEducation, Inc. All rights reserved.
36
3.6 Data üyeler, set Fonksiyonları ve get
Fonksiyonları
• UML diyagramı
– Bir operasyonun döndürdüğü değerin tipini gösterir
• Operasyon adından sonra gelen parantezlerden sonra iki
nokta üsüste ve tip yazılır.
– private üyeler için – işareti kullanılır
37.
2006 PearsonEducation, Inc. All rights reserved.
37
3.7 Yapılandırıcılarla nesnelere ilk değer
verilmesi
• Yapılandırıcılar
– Yapılandırıcılar, bir nesne oluşturulduğunda bu nesnenin
datalarına ilk değerlerini veren fonksiyonlardır.
• Nesne oluşturulduktan hemen sonra çağrılırlar.
• Yapılandırıcı ismi , sınıf ismi ile aynı olmalıdır.
• Geriye hiçbir veri döndürmezler. (void de olamazlar)
– Varsayılan (nesne oluşturulduğunda otomatik olarak çağrılan)
yapılandırıcının herhangi bir parametresi yoktur.
– Programcı tarafından sınıf için herhangi bir yapılandırıcı
oluşturulmamış olsa bile , derleyici bu sınıfa otomatik olarak bir
yapılandırıcı sağlayacaktır.
38.
2006 PearsonEducation,
Inc. All rights reserved.
38
Outline
fig03_07.cpp
(1 of 3)
1 // Fig. 3.7: fig03_07.cpp
2 // GradeBook sınıfından birden fazla nesnenin oluşturulması ve her
3 // GradeBook nesnesi üretildiğinde bu nesnelerin ders adı değerinin
4 // yapılandırıcılar vasıtasıyla atanması.
5 #include <iostream>
6 using std::cout;
7 using std::endl;
8
9 #include <string> // program C++ standard string sınıfını kullanır
10 using std::string;
11
12 // GradeBook sınıf tanımlaması.
13 class GradeBook
14 {
15 public:
16 // Yapılandırıcı, parametre olarak sağlanan karakter dizisi değeri ile
// dersAdi ‘nın ilk değerini atar.
17 GradeBook( string isim )
18 {
19 setDersAdi ( isim ); // dersAdi data üyesininin set fonksiyonunu çağır.
20 } // GradeBook yapılandırıcısı sonu
21
22 // ders adını atayan fonksiyon
23 void setDersAdi( string isim )
24 {
25 dersAdi=isim; // ders adını nesne içerisinde sakla.
26 } // setDersAdi fonksiyonunun sonu
27
Yapılandırıcının adı sınıfın adı
ile aynıdır ve hiçbir dönüş tipi
yoktur.
Bu sınıfın data üyesi olan
dersAdi degiskenine ilk
değerini ata.
39.
2006 PearsonEducation,
Inc. All rights reserved.
39
Outline
fig03_07.cpp
(2 of 3)
28 // dersin adını döndüren fonksiyon
29 string getDersAdi()
30 {
31 return dersAdi; // nesnenin dersAdi ‘nı döndür
32 } // getDersAdi fonksiyonunun sonu
33
34 // GradeBook kullanıcısına bir hoşgeldin mesajı göster.
35 void mesajYaz()
36 {
37 // dersAdi değerini almak için getDersAdi fonksiyonunu çağır.
38 cout << getDersAdi() << "dersine hoşgeldiniz !n" << endl;
39
40 } // mesajYaz fonksiyonunun sonu
41 private:
42 string dersAdi; // GradeBook sınıfı için ders adı değişkeni.
43 }; // GradeBook sınıfının sonu
44
40.
2006 PearsonEducation,
Inc. All rights reserved.
40
Outline
fig03_07.cpp
(3 of 3)
45 // main fonksiyonu programın çalışmasını bağlatır.
46 int main()
47 {
48 // iki GradeBook nesnesi oluştur.
49 GradeBook defter1( "BILM219 C++ Programlama" );
50 GradeBook defter2( "BILM101 C Programlama" );
51
52 // GradeBook nesnelerinin derAdi degerlerini görüntüle.
53 cout << “defter1 " << defter1.getDersAdi() << ” dersi içindir.”
54 << "ndefter2 ” << defter2.getDersAdi() <<" dersi içindir.”
55 << endl;
56 return 0; // başarılı bir bitiş olduğunu belirt.
57 } // main fonksiyonunun sonu
defter1 BILM219 C++ Programlama dersi içindir.
defter2 BILM101 C Programlama dersi içindir.
Nesneler oluşturulduğu anda yapılandırıcıları
çağrılır.
41.
2006 PearsonEducation, Inc. All rights reserved.
41
Hataları engelleme 3.2
Sınıfınızdaki data üyelerine ilk değer atama
ihtiyacınız olmasa bile, sınıfınızdan üretilen
her nesnenin data üyelerinin anlamlı değerlere
sahip olduğundan emin olmak için sınıfınıza bir
yapılandırıcı sağlayın.
42.
2006 PearsonEducation, Inc. All rights reserved.
42
Yazılım Mühendisliği Görüşü 3.5
Data üyelerinin ilk değerleri yapılandırıcı vasıtasıyla ya da
nesne üretildikten sonra set fonksiyonları ile atanabilir.
Ancak, sınıftan üretilen nesneleri kullanan programın
nesnenin üye fonksiyonlarını çağırmasından önce bu
nesnenin ilk değerlenin hepsinin düzgün bir biçimde
atandığından emin olmak iyi bir yazılım mühendisliği
uygulamasıdır.
Nesnenin ilk değerlerinin düzgün bir şekilde atandığından
emin olmak için , ilk değerlerin atanması işlemi bu nesneyi
kullanan programa(istemci uygulama) bırakılmamalı ,
sınıf içerisinde yapılandırıcılar vasıtasıyla sağlanmalıdır..
43.
2006 PearsonEducation, Inc. All rights reserved.
43
3.7 Yapılandırıcılar ile İlk değer atama
(Devam.)
• UML sınıf diyagramında yapılandırıcılar
– Üye fonksiyonları ile beraber üçüncü bölmede bulunur.
– Bir yapılandırıcıyı sınıfın diğer üye fonksiyonlardan
ayırabilmek için;
• UML, yapılandırıcının adından önce <<constructor>>
ibaresini yerleştirir.
• - <<constructor>> GradeBook()
– Genellikle üçüncü bölmedeki diğer fonksiyonlardan önce
yerleştirilir.
44.
2006 PearsonEducation, Inc. All rights reserved.
44
Fig.3.8 | GradeBook sınıfının String tipindeki name parametresine sahip
yapılandırıcısını belirten UML sınıf diyagramı.
45.
2006 PearsonEducation, Inc. All rights reserved.
45
3.8 Bir sınıfı tekrar kullanmak için
ayrı bir dosyaya yüklemek
•.cpp dosyası kaynak kodu dosyası olarak bilinir.
• Header dosyaları
– Genellikle .h dosya uzantısına sahiptirler.
– İçerisinde sınıf tanımlamaları bulunan dosyaları ayırır.
• Sınıflar başka yerlerde kullanıldığında, derleyicinin bunları
tanımasını sağlar.
• Bir .cpp dosyası içerisinde tanımlanan bir sınıf sadece o dosya
içerisinde kullanılabilir, fakat .h dosyaları içerisindeki sınıflar bu .h
dosyasını ekleyen (#include “benimSinifim.h”) her dosyada
kullanılabilir.
• Sürücü dosyaları
– Sınıfları (ya da yazılımları) test etmek için kullanılan
programlardır.
– main fonksiyonları vardır , dolayısıyla çalıştırılabilirler.
46.
2006 PearsonEducation,
Inc. All rights reserved.
46
Outline
fig03_09.cpp
(1 of 2)
1 // Fig. 3.9: GradeBook.h
2 // GradeBook sınıf tanımlaması (main fonksiyonu içeren dosyanın dışında)
3 #include <iostream>
4 using std::cout;
5 using std::endl;
6
7 #include <string> // GradeBook sınıfı C++ standard string sınıfını kullanır.
8 using std::string;
9
10 // GradeBook sınıf tanımlaması
11 class GradeBook
12 {
13 public:
14 // parametre olarak sağlanan bir karakter dizisi ile ders adini atayan
yapılandırıcı.
15 GradeBook( string isim )
16 {
17 setDersAdi( isim ); // ders adini atayan fonksiyonu cagir.
18 } // GradeBook yapılandırıcısının sonu
19
20 // ders adına değer atayan fonksiyon.
21 void setDersAdi( string isim )
22 {
23 dersAdi = isim; // ders adını nesne içerisine sakla
24 } // setDersAdi fonksiyonunun sonu
25
Sınıfın tanımlaması header
dosyasının içinde.
47.
2006 PearsonEducation,
Inc. All rights reserved.
47
Outline
fig03_09.cpp
(2 of 2)
26 // ders adını döndüren fonksiyon
27 string getDersAdi()
28 {
29 return dersAdi; // nesnenin dersAdi data üyesinin değerini döndür.
30 } // getDersAdi fonksiyonunun sonu
31
32 // GradeBook kullanıcısına bir hoşgeldin mesajı yaz.
33 void mesajYaz()
34 {
35 // ders adını almak için getDersAdi fonksiyonunu çağır.
36 cout << getDersAdi() << ” dersine hoşgeldiniz !” << endl;
37
38 } // mesajYaz fonksiyonunun sonu
39 private:
40 string dersAdi; // GradeBook sınıfının ders adı değişkeni.
41 }; // GradeBook sınıfının sonu
48.
2006 PearsonEducation,
Inc. All rights reserved.
48
Outline
fig03_10.cpp
(1 of 1)
1 // Fig. 3.10: fig03_10.cpp
2 // main fonksiyonunda kullanabilmek için GradeBook.h dosyasından GradeBook
sınıfını ekler.
3 #include <iostream>
4 using std::cout;
5 using std::endl;
6
7 #include "GradeBook.h" // GradeBook sınıfının tanımlamasını ekle.
8
9 // main fonksiyonu programın çalışmasını başlatır.
10 int main()
11 {
12 // iki GradeBook nesnesi oluştur.
13 GradeBook defter1( "BILM219 C++ Programlama" );
14 GradeBook defter2( "BILM101 C Programlama" );
15
16 // GradeBook nesnelerinin ders adlarını yaz.
17 cout << "defter1 " << defter1.getDersAdi() << “ dersi için oluşturuldu”
18 << "ndefter2 " << defter2.getDersAdi() << “ dersi için oluşturuldu”
19 << endl;
20 return 0; // başarılı bir bitiş olduğunu belirt.
21 } // main fonksiyonu sonu
defter1 BILM219 C++ Programlama dersi için oluşturuldu
defter2 BILM101 C Programlama dersi için oluşturuldu
Header dosyasını ekleyerek, içerisindeki
sınıf tanımlamasını bu dosyaya
kopyalamış oluruz.
49.
2006 PearsonEducation, Inc. All rights reserved.
49
3.8 Bir sınıfı tekrar kullanmak için
ayrı bir dosyaya yüklemek (Devam.)
• #include önişlemci komutu
– Header(öncü) dosyalarını eklemek için kullanılır.
• C++ önişlemcisiden belirtilen dosya içeriğini bu komutun
kullanıldığı yere kopyalamasını ister.
– Çift Tırnak (“) işareti kullanıcı-tanımlı header(.h)
dosyalarını belirtir.
• Ön işlemci bu dosyayı bulmak için öncelikle programın bulunduğu
dizine bakar.
– Eğer .h dosyası bu dizinde değilse, C++ Standart kütüphanesinin dizinine bakar.
– #include “BenimDosyam.h”
– Küçük-Büyük (< >) işaretleri C++ Standart
kütüphanelerini belirtir.
• Önişlemci sadece C++ Standart kütüphane dizinine bakar.
• - #include <iostream>
50.
2006 PearsonEducation, Inc. All rights reserved.
50
3.8 Bir sınıfı tekrar kullanmak için
ayrı bir dosyaya yüklemek (Devam.)
• Nesnelerin oluşturulması
– Derleyici nesnenin boyutunu (hafıza içerisinde kaplayacağı
alanı) bilmek zorundadır.
• C++ nesneleri tipik olarak sadece data üyelerini içerirler.
• Derleyici, sınıfın üye fonksiyonlarının bir kopyasını
oluşturur.
– Bu kopya sınıfın tüm nesneleri arasında paylaştırılır.
51.
2006 PearsonEducation, Inc. All rights reserved.
51
Hataları Engelleme 3.3
Önişlemcinin header dosyalarını bulmasını
garantiye almak için, kullanıcı-tanımlı header
dosyaları #include önişlemci komutunda tırnak
içinde (örn: "GradeBook.h"), ve C++ Standart
Kütüphane dosyaları ise <> işaretleri içinde(örn:
<iostream> ) belirtilmelidir.
52.
2006 PearsonEducation, Inc. All rights reserved.
52
3.9 Arabirimi Uygulamadan Ayırmak
• Arabirim
– Sınıfı kullanacak programın (istemci) bu sınıfın hangi işlemlerini
kullanacağını ve bu işlemler için nasıl istekte bulunacağını tanımlar.
• Fakat sınıfın bu işlemleri nasıl yerine getirdiğini belirtmez.
• Arabirim, sadece üye fonksiyonlarının adlarını, dönüş tiplerini ve parametre
tiplerini listeleyen sınıf tanımlamasıdır.
– Fonksiyon prototiplerini içerir.
– Bir sınıfın arabirimi , sınıfın public üye fonksiyonlarını içerir. (işlemler)
• Arabirimi uygulamadan ayırmak
– Bazen uygulamada bazı üye fonksiyonların içeriği değişebilir (.cpp
dosyasında), ancak, arabirim (.h dosyası) aynı kaldığı sürece
(prototipler değişmedikçe), istemci uygulamasının değiştirilmesine gerek
yoktur.
– int topla(int ,int ) ; //fonksiyon prototipi
– int topla(int a,int b) { return a+b; }
– int topla(int sayi1,int sayi2){ int c=sayi1+sayi2; return c; }
53.
2006 PearsonEducation, Inc. All rights reserved.
53
3.9 Arabirimi Uygulamadan
Ayırmak(Devam.)
• Arabirimi Uygulamadan Ayırmak (Devam.)
– Üye fonksiyonların yapacağı işlemleri, sınıf
tanımlamasının olduğu (.h) dosyasından ayrı bir kaynak
kodu dosyasında(.cpp) tanımlayın.
• Bir sınıfın kaynak kodu dosyasında, işlemlerini
tanımlayacağınız üye fonksiyonu belirlemek için kapsam
çözünürlük operatörünü( :: ) kullanın.
• <sınıf Adı> :: <üye fonksiyonu>
• Sınıfınızı kullanacak olan programın sınıftaki üye
fonksiyonlarının içerisindeki işlemlerin detayını bilmesine
ihtiyaç yoktur. Bunun için, .h dosyalarındaki sınıf
tanımlamalarında sadece üye fonksiyonların prototipleri
bulunur. Bu prototipler sınıfın umumi(public) arabirimini
oluştururlar.
54.
2006 PearsonEducation,
Inc. All rights reserved.
54
Outline
fig03_11.cpp
(1 of 1)
1 // Fig. 3.11: GradeBook.h
2 // GradeBook sınıf tanımlaması. Bu dosya GradeBook sınıfının public arabirimini
3 // temsil eder.Bu dosyada sadece GradeBook sınıfının üye fonksiyonlarının
4 // prototipleri bulunur, fonksyionların uygulaması GradeBook.cpp içerisindedir.
5 #include <string> // GradeBook sınıfı C++ standard string sınıfını kullanır.
6 using std::string;
7
8 // GradeBook sınıf tanımlaması
9 class GradeBook
10 {
11 public: // Üye Fonksiyonlarının Prototipleri;
12 GradeBook( string ); // dersAdi değişkenine ilk değerini veren yapılandırıcı.
13 void setDersAdi( string ); // ders adını atayan fonksiyon.
14 string getDersAdi(); // ders adını döndüren fonksiyon
15 void mesajYaz(); // hoşgeldin mesajı görüntüleyen fonksiyon
16 private:
17 string dersAdi; // GradeBook sınıfı için dersAdi değişkeni
18 }; // GradeBook sınıfının sonu
Arabirim data üyeleri ve üye
fonksiyonlarını içerir.
55.
2006 PearsonEducation, Inc. All rights reserved.
55
Genel Programlama Hataları 3.8
Fonksiyon prototiplerinin sonlarına noktalı
virgül( ; ) işaretinin konulmaması bir yazım
hatasıdır.
56.
2006 PearsonEducation, Inc. All rights reserved.
56
İyi programlama örneği 3.7
Fonksiyon prototiplerinde parametre isimlerinin
yazılması mecburi olmamasına rağmen (derleyici
açısından yazılıp yazılmamasını bir önemi yoktur) ,
birçok programcı dökümantasyon amacıyla parametre
isimlerini yazarlar.
57.
2006 PearsonEducation, Inc. All rights reserved.
57
Hataları Engelleme 3.4
Fonksiyon prototiplerinde parametre isimlerini yazmak
istiyorsanız , yanlış anlamalara veya kafa karışıklığına
neden olmamak için ilk önce kaynak kodu dosyasında
fonksiyonu kodlayın , daha sonra fonksiyonun ilk
satırını kopyalayarak , sınıf arabiriminin tanımlandığı
yerdeki public bölümüne yapıştırın ve sonuna (;) koyun.
Böylece, fonksiyon prototipi ile fonksiyonun kendisi
arasında herhangi bir parametre ismi farklılığı
oluşmayacaktır.
58.
2006 PearsonEducation, Inc. All rights reserved.
58
Genel Programlama Hataları 3.9
Bir sınıfın üye fonksiyonlarını , sınıfın
tanımlandığı yerden başka bir yerde
tanımlarken kapsam çözünürlük operatörünü
(::) kullanmamak derleme hatasına neden olur.
59.
2006 PearsonEducation,
Inc. All rights reserved.
59
Outline
fig03_12.cpp
(1 of 2)
1 // Fig. 3.12: GradeBook.cpp
2 // GradeBook üye fonksiyon tanımlamaları. Bu dosya GradeBook.h dosyasında
3 // prototipleri bulunan fonksiyonların uygulamalarını içerir.
4 #include <iostream>
5 using std::cout;
6 using std::endl;
7
8 #include "GradeBook.h" // GradeBook sınıf tanımlamasını dahil et.
9
10 // parametre olarak verilen string ile dersAdini atayan yapılandırıcı
11 GradeBook::GradeBook( string isim )
12 {
13 setDersAdi( isim ); // dersAdi’nı atamak için set fonksiyonunu çağır.
14 } // GradeBook yapılandırıcısının sonu
15
16 // ders adına değer atayan fonksiyon
17 void GradeBook::setDersAdi( string isim )
18 {
19 dersAdi = isim; // nesne içerisinde ders adını sakla.
20 } // setDersAdi fonksiyonunun sonu
21
Kapsam çözünürlük operatörü( :: )
sağında bulunan üye fonksiyonunun
, solundaki sınıfa ait olduğunu
belirtir.
<Sınıf> :: <Üye fonksiyon>
GradeBook uygulaması ayrı bir
kaynak kodu dosyasındadır.
GradeBook sınıfına ulaşabilmek
için , header dosyasını dahil et.
60.
2006 PearsonEducation,
Inc. All rights reserved.
60
Outline
fig03_12.cpp
(2 of 2)
22 // ders adını döndüren fonksiyon
23 string GradeBook::getDersAdi()
24 {
25 return dersAdi; // nesnenin ders adını döndür.
26 } // getDersAdi() fonksiyonunun sonu
27
28 // GradeBook kullanıcı için bir hoşgeldin mesajı yaz.
29 void GradeBook::mesajYaz()
30 {
31 // ders adını almak için getDersAdı fonksiyonunu çağır.
32 cout << getDersAdi() << " dersine hoşgeldiniz ” << endl;
33
34 } // mesajYaz fonksiyonunun sonu
61.
2006 PearsonEducation,
Inc. All rights reserved.
61
Outline
fig03_13.cpp
(1 of 1)
1 // Fig. 3.13: fig03_13.cpp
2 // Arabirim ve uygulamanın ayrılmasından sonra GradeBook sınıfının
3 // kullanılmasının gösterilmesi.
4 #include <iostream>
5 using std::cout;
6 using std::endl;
7
8 #include "GradeBook.h" // GradeBook sınıf tanımlamasını dahil et.
9
10 // programın çalışmasını başlatan main fonksiyonu
11 int main()
12 {
13 // iki GradeBook nesnesi oluştur
14 GradeBook defter1( "BILM219 C++ Programlama" );
15 GradeBook defter2( "BILM101 C Programlama" );
16
17 // her GradeBook nesnesinin ilk değerlerini göster.
18 cout << "defter1 ‘in ders Adi : " << defter1.getDersAdi()
19 << "ndefter2 ‘nin ders Adi : " << defter2.getDersAdi()
20 << endl;
21 return 0; // başarılı bir bitiş olduğunu belirt
22 } // main fonksiyonunun sonu
defter1 ‘in ders Adi : BILM219 C++ Programlama
defter2 ‘nin ders Adi : BILM101 C Programlama
62.
2006 PearsonEducation, Inc. All rights reserved.
62
3.9 Arabirimi Uygulamadan
Ayırmak (Devam)
• Derleme ve Bağlantı (link) işlemi
– Kaynak-Kodu dosyası sınıfın nesne kodunu oluşturmak için
derlenir. (Kaynak kodu dosyası header dosyasını dahil etmelidir.
(#include)
• Sınıf uygulama programcısı istemciye nesne kodunu ve header
dosyasını sağlamalıdır.
– İstemci, header dosyasını kendi koduna dahil etmelidir
(#include)
• Böylece, derleyici main fonksiyonunun sınıfın nesnelerini doğru
biçimde oluşturup kullandığından emin olabilir.
– Çalıştırılabilir(Executable) uygulamalar oluşturma
• İstemci kodundan oluşturulan nesne kodu , sınıf için oluşturulan
nesne kodu ve uygulamada kullanılan C++ Standart
Kütüphanelerinin nesne kodları ile birleştirilmelidir.
• Çalıştırılabilir uygulama = İstemci nesne kodu + sınıf nesne kodu +
Standart Kütüphane nesne kodu
63.
2006 PearsonEducation, Inc. All rights reserved.
63
Fig.3.14 | Çalıştırılabilir bir uygulama üretmek için gereken derleme ve bağlantı işlemleri.
64.
2006 PearsonEducation, Inc. All rights reserved.
64
3.10 set fonksiyonuyla Data değerini
değiştirmek
• set fonksiyonları ,verileri(data) doğrulayabilir.
– Doğruluk kontrolünü yapar.
– Nesnelerin her zaman tutarlı datalara sahip olmasını sağlar.
• Data üyeleri her zaman doğru değerlere sahip olmalıdır.
– Data üyelerine geçersiz değerler atanmaya çalışıldığında , bunu
belirtmek için geriye değer döndürebilirler.
– int setDakika(int d){
– if (d>59) return -1; //geçersiz değer girildiğini belirt.
– dakika=d;
– return 0; //geçerli değer girildiğini belirt.
– }
– string üye fonksiyonları
– length : string (karakter dizisi) içindeki karakter sayısını döndürür.
– Substr : bir string içindeki belirlenen alt stringi döndürür.
65.
2006 PearsonEducation,
Inc. All rights reserved.
65
Outline
fig03_15.cpp
(1 of 1)
1 // Fig. 3.15: GradeBook.h
2 // Sınıfın public arabirimini temsil eden GradeBook sınıf tanımlaması.
3 // Üye fonksiyon uygulamaları GradeBook.cpp içerisindedir.
4 #include <string> // program C++ standart string sınıfını kullanır
5 using std::string;
6
7 // GradeBook sınıf tanımlaması
8 class GradeBook
9 {
10 public:
11 GradeBook( string ); // GradeBook nesnesine ilk değerini veren yapılandırıcı.
12 void setDersAdi( string ); // ders adını atayan set fonksiyonu
13 string getDersAdi(); // Ders adının döndüren fonksiyon
14 void mesajYaz(); // Hoşgeldin mesajı görüntüleyen fonksiyon
15 private:
16 string dersAdi; // GradeBook sınıfının ders adı
17 }; // GradeBook sınıfının sonu
66.
2006 PearsonEducation,
Inc. All rights reserved.
66
Outline
fig03_16.cpp
(1 of 2)
1 // Fig. 3.16: GradeBook.cpp
2 // GradeBook üye fonksiyonlarının uygulamaları..
3 // setDersAdi fonksiyonu doğrulama işini yürütür.
4 #include <iostream>
5 using std::cout;
6 using std::endl;
7
8 #include "GradeBook.h" // GradeBook sınıfı tanımlamasını dahil et.
9
10 // Parametre olarak sağlanan string ile dersAdi’ nailk değerini veren
yapılandırıcı.
11 GradeBook::GradeBook( string isim )
12 {
13 setDersAdi( isim ); // dersAdi ‘nı doğrula ve kaydet.
14 } // GradeBook yapılandırıcısının sonu
15
16 // ders adını atayan fonksiyon. Ders adının en fazla 25 karakter olmasını
17 // sağlar.
18 void GradeBook::setDersAdi( string isim )
19 {
20 if ( isim.length() <= 25 ) // eğer isim 25 veya daha az karakterliyse.
21 dersAdi = isim; // ders adını kaydet. (Problem Yok)
22
setDersAdi fonksiyonu dersAdi data
üyesinin her zaman doğru değerlere sahip
olmasını garantiye alır.
Yapılandırıcı , doğrulama
kontrolü için set
fonksiyonunu çağırır.
67.
2006 PearsonEducation,
Inc. All rights reserved.
67
Outline
fig03_16.cpp
(2 of 2)
23 if ( isim.length() > 25 ) // eğer isim 25 karakterden fazlaysa
24 {
25 // ismin ilk 25 karakterini al.
26 dersAdi = isim.substr( 0, 25 ); // 0 dan başla , 25 karakter al.
27
28 cout << "isim "" << isim << "" (25) karakterden fazla!n"
29 << "İlk 25 karakteri alınıyor...n" << endl;
30 } // if sonu
31 } // setDersAdi fonksiyonunun sonu
32
33 // ders adının döndüren fonksiyon
34 string GradeBook::getDersAdi()
35 {
36 return dersAdi; // Nesnenin dersAdi değerini döndür
37 } // getDersAdi fonksiyonunun sonu
38
39 // GradeBook kullanıcısına bir hoşgeldin mesajı görüntüle
40 void GradeBook::mesajYaz()
41 {
42 // ders adını almak için getDersAdi() fonksiyonunu çağır.
43 cout << getDersAdi() << " dersine hoşgeldiniz!" << endl;
44
45 } // mesajYaz fonksiyonunun sonu
68.
2006 PearsonEducation,
Inc. All rights reserved.
68
Outline
fig03_17.cpp
(1 of 2)
1 // Fig. 3.17: fig03_17.cpp
2 // GradeBook nesneleri oluştur ve doğrulamayı test et.
3 #include <iostream>
4 using std::cout;
5 using std::endl;
6
7 #include "GradeBook.h" // GradeBook sınıf tanımlamasını dahil et.
8
9 // Main fonksiyonu programın çaışmasını başlatır.
10 int main()
11 {
12 // İki GradeBook nesnesi oluştur
13 // defter1 ‘in ilk değeri çok uzun
14 GradeBook defter1( "BILM102 C++ ile programlamaya giriş" );
15 GradeBook defter2( "BILM219 C++ Programlama" );
16
Yapılandırıcı, doğrulama kontrolü
için set fonksiyonunu çağırır.
69.
2006 PearsonEducation,
Inc. All rights reserved.
69
Outline
fig03_17.cpp
(2 of 2)
17 // her GradeBook’un ilk değerini göster
18 cout << "defter1 ‘in ilk ders Adi : "
19 << defter1.getDersAdi()
20 << "ndefter2 ‘nin ilk ders Adi: "
21 << defter2.getDersAdi() << endl;
22
23 // defter1 ‘in ders adını geçerli uzunlukta bir değer ile değiştir.
24 defter1.setDersAdi( "BILM102 C++ Programlama" );
25
26 // Her GradeBook’un dersAdi değerini göster
27 cout << "ndefter1’in ders adi : "
28 << defter1.getDersAdi()
29 << "ndefter2 'nin ders adi: "
30 << defter2.getDersAdi() << endl;
31 return 0; // başarılı bitiş
32 } // main fonksiyonu sonu
isim "BILM102 C++ ile programlamaya giriş" (25) karakterden fazla !
İlk 25 karakteri alınıyor...
defter1'in ilk ders Adi : BILM102 C++ ile programla
defter2'nin ilk ders Adi: BILM219 C++ Programlama
defter1'in ders adi : BILM102 C++ Programlama
defter2'nin ders adi: BILM219 C++ Programlama
Doğruluk sınaması için set fonksiyonunu
çağır.
70.
2006 PearsonEducation, Inc. All rights reserved.
70
Yazılım Mühendisliği Görüşü 3.6
Data üyelerinin private yapılması ve özellikle
yazma erişimi olmak üzere erişimlerin public üye
fonksiyonlar ile kontrol edilmesi veri
doğruluğunu korumaya yardım eder .
71.
2006 PearsonEducation, Inc. All rights reserved.
71
Hataları Engelleme 3.5
Data üyeleri private olduğu için veri doğrulama
işi sınıfı kullanan istemci uygulamalar
tarafından yapılamaz. Sınıfı tanımlayan
programcı uygun veri doğrulamayı yapmalı ve
gerektiğinde hata raporlarını sağlamalıdır.
72.
2006 PearsonEducation, Inc. All rights reserved.
72
Yazılım Mühendisliği Görüşü 3.7
Private data üyelerine değer atayan üye
fonksiyonlar(set fonksiyonları) , parametre olarak
gönderilmiş verilerin doğruluğunu kontrol
etmelidir. Eğer doğru değerler değil ise, private
data üyelerinin doğruluğunu koruyarak uygun
değere sahip bir biçimde kalmasını
sağlamalıdırlar. Eğer gerekirse, data üyelerine
atanmak istenen verinin geçersiz olduğunu bir
hata mesajıyla belirtmelidirler.