bas5e bol 03_turkce_tamami
DESCRIPTION
Sınıflara ve Nesnelere GirişTRANSCRIPT
1
2006 Pearson Education, Inc. All rights reserved.
33
Sınıflara ve Nesnelere Giriş
2
2006 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
1 // 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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
Genel hatalar 3.2
Döndürme tipi void olan bir fonksiyonun bir değer döndürmesi derleyici hatası verir.
11
2006 Pearson Education, Inc. All rights reserved.
Genel hatalar 3.3
Bir fonksiyonun içinde başka bir fonksiyon tanımlamak hatadır.
12
2006 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
Fig.3.2 | UML sınıf diyagramı GradeBook sınıfının public displayMessage operasyonu var.
14
2006 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
Genel hatalar 3.4
Fonksiyon tanımındaki parantez kapandıktan hemen sonra noktalı virgül konması yazılım hatası verir.
21
2006 Pearson Education, Inc. All rights reserved.
Genel hatalar 3.5
Fonksiyon parametresini fonksiyonun içinde tekrar değişken olarak tanımlamak derleyici hatası verir.
22
2006 Pearson Education, Inc. All rights reserved.
İ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 Pearson Education, Inc. All rights reserved.
İ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 Pearson Education, Inc. All rights reserved.
Fig.3.4 displayMessage() fonksiyonu string tipinde ve courseName adında bir parametre alıyor.
25
2006 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
İ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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
Genel hatalar 3.6
Bir fonksiyon üyesi olmadığı bir sınıfın private üyesine ulaşmaya çalışırsa derleme hatası olur.
33
2006 Pearson Education, Inc. All rights reserved.
İ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 Pearson Education, Inc. All rights reserved.
Genel Hatalar 3.7
Değer döndürmesi gereken fonksiyonun değer döndürmemesi derleme hatasına sebep olur.
35
2006 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
Genel Programlama Hataları 3.8
Fonksiyon prototiplerinin sonlarına noktalı virgül( ; ) işaretinin konulmaması bir yazım hatasıdır.
56
2006 Pearson Education, Inc. All rights reserved.
İ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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
Fig.3.14 | Çalıştırılabilir bir uygulama üretmek için gereken derleme ve bağlantı işlemleri.
64
2006 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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 Pearson Education, Inc. All rights reserved.
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.