C++ Dersi:Nesne Tabanlı Programlama
Çiğdem Turhan
Fatma Cemile Serçe
Bölüm 10: Yapıcı ve Yıkıcı Fonksiyonlar
İçerik
– Yapıcı Fonksiyonlar
• Yapıcı Fonksiyon Tanımı
• Üyelere İlk Atama
• Yapıcı Fonksiyonu Yükleme
• Yapıcı Fonksiyon Çağırımı
• Kopya Yapıcı Fonksiyon
–Otomatik Üye Atamaları
– Yıkıcı Fonksiyonlar
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
2
Yapıcı Fonksiyon
• İng. constructor
• Bir nesnenin tanımında bu nesne üyelerine ilk değer ataması yapmak için kullanılan özel fonksiyonlardır
• Bir nesne tanımlandığında otomatik olarak çalışır.
• Yapıcı fonksiyon yazarken dikkat edilmesi gereken hususlar: – Yapıcı fonksiyonun ismi sınıf ismi ile aynı olmalıdır.
– Yapıcı fonksiyonların döndürme tipi yoktur.
– Nesne tanımı yapıldığında otomatik olarak çağırıldıkları için yapıcı fonksiyonları özel olarak çağırmaya gerek yoktur.
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
3
Örnek //yapıcı fonksiyon kullanılmadığı durum
#include <iostream> using namespace std;class Dikdortgen {
int en,boy; public:
void ata(int e,int b){en=e; boy=b;}int alan() { return en*boy; }
};int main() {
Dikdortgen x; x.ata(5,10); cout<<”Alan= “<<x.alan()<<endl; return 0;
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
4
x isimli bir dikdörtgen nesnesi
x ’in enine 5, boyuna 10 atanır alan()
en
x
5
ata()
boy 10
Örnek //yapıcı fonksiyon kullanan çözüm
#include <iostream> using namespace std;class Dikdortgen {
int en,boy; public:
Dikdortgen(int e,int b){
en=e; boy=b;}
int alan(){
return en*boy; }
};int main() {
Dikdortgen x(5,10); cout<<"Alan= "<<x.alan()<<endl; return 0;
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
5
yapıcı fonksiyon tanımı
x adlı bir dikdörtgen tanımlanır ve yapıcı çağırılır
ÇIKTIAlan=50
Açıklama
• Yapıcı fonksiyon tanımı:
Dikdortgen(int e,int b){en=e; boy=b;}
• Yapıcı fonksiyon çağrımı:
Dikdortgen x(5,10);
• Yapıcı fonksiyonun ismi (Dikdortgen) sınıf ismi ile aynıdır.
• Yapıcı fonksiyonun döndürme tipi tanımlanmamıştır.
• ata() fonksiyonunda olduğu gibi e ve b parametrelerini en ve boy üyelerine atamakla görevlidir.
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
6
Yapıcı fonksiyonları public olarak tanımlamayı unutmamamız gerekir, aksi takdirde
otomatik olarak çağırılmaları mümkün olamaz.
Örnek class Nokta
{
int x,y;
public:
Nokta(int a=0,int b=0){x=a;y=b;}
int xDegeri(){return x;}
};
int main()
{
Nokta bir(12,6);
Nokta iki(25);
Nokta uc;
cout<<"bir'in x koordinati: "<<bir.xDegeri()<<endl;
cout<<"iki'nin x koordinati: "<<iki.xDegeri()<<endl;
cout<<"uc'un x koordinati: "<<uc.xDegeri()<<endl;
return 0;
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
7
yapıcı fonksiyon tanımı
bir nesnesi yaratılır ve yapıcı çağırılır
iki nesnesi yaratılır ve yapıcı çağırılır
uc nesnesi yaratılır ve yapıcı çağırılır
ÇIKTIbir’in x koordinati: 12iki’nin x koordinati: 25uc’un x koordinati: 0
Açıklama
Nokta bir(12,6);
Nokta iki(25);
Nokta uc;
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
8
xDegeri()
x
bir
12
Nokta()
y 6
xDegeri()
x
iki
25
Nokta()
y 0
xDegeri()
x
uc
0
Nokta()
y 0
bir nesnesi için yapıcı fonksiyona 2parametre, iki nesnesi için 1 parametreyollanır, uc nesnesi için ise hiç bir parametregönderilmez. Bu durumda iki ve ucnesneleri için varsayılan değerler kullanılır vebu nesneler aşağıdaki şekilde oluşur.
Varsayılan Yapıcı Fonksiyon
• İng. Default constructor
• Hiç parametresi olmayan yapıcı fonksiyonlardır
Ogrenci();
Ogrenci::Ogrenci()
{...}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
9
varsayılan yapıcı fonksiyon
Varsayılan yapıcı fonksiyon tanımı
Üyelere İlk Atama
• İng. Member initialization
• Yapıcı fonksiyonlarında atama operatörünü (=) kullanmadan nesne üyelerine ilk değerlerini atamaya üyelere ilk atama adı verilir.
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
10
Bir sınıfın sabit, referans ve nesne üyelerine sadece ilk atama ile değer verilebilir
Örnek class Basit
{
int i;
float f;
public:
Basit(int,float);
};
Basit::Basit(int a,float b)
{
i=a;
f=b;
}
int main()
{
Basit nsn(1,2.5);
return 0;
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
11
= operatörü ile atama
Basit::Basit(int a,float b):i(a),f(b){}
İlk atama yöntemi
Yapıcı Fonksiyonunu Yükleme
• Yapıcı fonksiyonlar, farklı parametrelerle birden fazla tanımlanabilir
Eleman(){};
Eleman(int i,string s):no(i),isim(s){};
Eleman e1;
Eleman e2(123,"Ali");
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
12
1. yapıcı fonksiyon
2. yapıcı fonksiyon
1. yapıcı çağrılır
2. yapıcı çağrılır
Yapıcı Fonksiyonunu Yükleme...
• Eğer bir sınıfta hiçbir yapıcı fonksiyon tanımlanmamışsa, derleyici otomatik olarak içi boş bir varsayılan yapıcı fonksiyon tanımlar.
• Ama eğer sınıfta başka bir yapıcı fonksiyon tanımı yapıldıysa, varsayılan fonksiyon otomatik olarak yaratılmaz.
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
13
Örnek class Eleman
{
int no;
string isim;
};
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
14
class Eleman{
int no;string isim;public:
Eleman(int _no,string _isim):no(_no),isim(_isim);
};
Eleman e;
Eleman e;
class Eleman{
int no;string isim;public:
Eleman(){}Eleman(int _no,string _isim)
:no(_no),isim(_isim); };
Eleman e;
Yapıcı Fonksiyon Çağırımı
• Yapıcı fonksiyonlar nesne tanımı yapıldığı sırada otomatik olarak çağırılır
• Ayrıca yapıcı fonksiyon istenildiğinde de çağrılabilir
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
15
Örnek
class Basit
{
int i;
float f;
public:
Basit();
Basit::Basit(int a,float b)
:i(a),f(b) {}
};
Basit::Basit()
{ i=0;
f=0.0;
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
16
Basit nsn;
nsn=Basit(7,4.3);
nsn=Basit();
i
nsn
0
f 0
i
nsn
7
f 4.3
i
nsn
0
f 0
Kopya Yapıcı Fonksiyon
• İng. Copy constructor
• Aynı sınıf tipinde başka bir nesneyi parametre olarak alan yapıcı fonksiyonlardır
• Parametre olarak gelen nesneyi, içinde bulunduğu nesneye kopyalar.
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
17
Örnek class A
{
int no;
public:
A();
A(A &par);
};
A::A()
{
no=0;
cout<<"Varsayilan Yapici"<<endl;
}
A::A(A &par)
{
no=par.no;
cout<<"Kopya Yapici"<<endl;
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
18
int main() {
A a1; A a2(a1); A a3=a2; return 0;
}
Kopya yapıcı prototipi
Varsayılan yapıcı çağrılır
Kopya yapıcı çağrılır
Kopya yapıcı tanımıÇIKTIVarsayilan YapiciKopya YapiciKopya Yapici
Otomatik Üye Atamaları
• Aynı tipte bir nesne başka bir nesneye atanırsa, bu nesnenin tüm üyeleri ikinci nesnenin üyelerine otomatik olarak atanır.
– Tanımlama sırasında bir nesne bir başka nesneye atanırsa
– Bir fonksiyona parametre olarak bir nesne yollanırsa
– Bir fonksiyondan bir nesne döndürülürse
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
19
Otomatik Üye Atamaları...
• Tanımlama sırasında bir nesne bir başka nesneye atanırsa
#include <iostream>
using namespace std;
class Bir
{
int x;
float y;
public:
Bir(int _x,float _y):x(_x),y(_y){}
};
int main()
{
Bir n1(1,2.5);
Bir n2=n1;
return 0;
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
20
x
y
1
2.5
x
y
1
2.5
n2n1
n1 nesnesinin tüm üyeleri n2 nesnesine
otomatik olarak kopyalanır
Otomatik Üye Atamaları...
• Bir fonksiyona parametre olarak bir nesne yollanırsaclass Bir
{
int x;
float y;
public:
Bir(int _x,float _y):x(_x),y(_y){}
};
void fon(Bir a)
{
}
int main()
{
Bir nsn(1,2.5);
fon(nsn);
return 0;
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
21
nsn nesnesi a nesnesine yollanır
x
y
1
2.5
x
y
1
2.5
nsn
a
Otomatik Üye Atamaları...
• Bir fonksiyondan bir nesne döndürülürseclass Bir
{
int x;
float y;
public:
Bir(int _x,float _y):x(_x),y(_y){}
Bir(){}
};
Bir fon()
{
return Bir(1,2.5);
}
int main()
{
Bir nsn;
nsn = fon();
return 0;
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
22
fon( )’un döndürdüğü nesne nsn’e atanır
x
y
1
2.5
x
y
1
2.5
nsn
Örnek 7
• Aşağıdaki işlemde görüldüğü gibi iki rasyonel sayıyı çarpan bir program yazalım.
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
23
15
2
53
21
5
2
3
1
x
xx
1
3
Pay
Payda
#include <iostream>
using namespace std;
class Rasyonel
{
int pay,payda;
public:
Rasyonel(int x,inty):pay(x),payda(y){}
int payAl(){return pay;}
int paydaAl(){return payda;}
Rasyonel carp(Rasyonel&);
};
Rasyonel Rasyonel::carp(Rasyonel& r)
{
int a=r.payAl();
int b=r.paydaAl();
return Rasyonel(pay*a,payda*b);
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
24
int main(){
Rasyonel s(1,3),t(2,5); Rasyonel son=s.carp(t); cout<<s.payAl()<<”/”
<<s.paydaAl(); cout<<” * ”<<t.payAl()
<<”/”<<t.paydaAl();cout<<” = ”<<son.payAl()<<”/”
<<son.paydaAl()<<endl;return 0;
}
ÇIKTI
1/3 * 2/5 = 2/15
pay 2
payda 15
pay
son
2
payda 15
Yıkıcı Fonksiyonlar
• İng. Destructor
• Yıkıcı fonksiyonlar ise bir nesne programda yok edilmeden hemen önce otomatik olarak çağırılan üye fonksiyonlardır.
• Nesnenin yaratıldığı blok bittiğinde o nesne yok edilir ve yok olmadan hemen önce yıkıcı fonksiyon otomatik olarak çağrılır.
• Yıkıcı fonksiyonu yazarken şu noktalara dikkat etmemiz gerekir:– Yıkıcı fonksiyon ismi ~ işareti ile başlar ve sınıfla aynı ismi taşır
– Yıkıcı fonksiyonlara yükleme yapılmaz
– Parametreleri ve döndürme tipleri yoktur
– Otomatik olarak çağırılırlar
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
25
#include <iostream>
using namespace std;
class Eleman
{
int no;
public:
Eleman (int=0);
Eleman::Eleman (int x);
~Eleman();
};
Eleman::~Eleman()
{
cout<<"Yikici fonksiyon"<<endl;
cout<<"No: "<<no<<endl; }
};
Eleman::Eleman (int x)
{
no=x;
cout<<"Yapici fonksiyon"<<endl;
}
C++ Dersi: Nesne Tabanlı Programlama © 2012
Çiğdem TurhanFatma Cemile Serçe
26
int main(){
Eleman kisi1(123),kisi2;return 0;
}
ÇIKTI
Yapici fonksiyonYapici fonksiyonYikici fonksiyonNo: 0Yikici fonksiyonNo: 123