26
C++ Dersi: Nesne Tabanlı Programlama Çiğdem Turhan Fatma Cemile Serçe Bölüm 10: Yapıcı ve Yıkıcı Fonksiyonlar

C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

  • Upload
    others

  • View
    20

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

C++ Dersi:Nesne Tabanlı Programlama

Çiğdem Turhan

Fatma Cemile Serçe

Bölüm 10: Yapıcı ve Yıkıcı Fonksiyonlar

Page 2: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

İç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

Page 3: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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

Page 4: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

Ö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

Page 5: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

Ö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

Page 6: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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.

Page 7: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

Ö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

Page 8: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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.

Page 9: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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ı

Page 10: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

Ü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

Page 11: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

Ö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

Page 12: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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

Page 13: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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

Page 14: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

Ö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;

Page 15: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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

Page 16: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

Ö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

Page 17: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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

Page 18: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

Ö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

Page 19: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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

Page 20: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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

Page 21: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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

Page 22: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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

Page 23: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

Ö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

Page 24: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

#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

Page 25: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

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

Page 26: C++ Dersi: Nesne Tabanlı Programlama...İçerik –Yapıcı Fonksiyonlar •Yapıcı Fonksiyon Tanımı •Üyelere İlk Atama •Yapıcı Fonksiyonu Yükleme •Yapıcı Fonksiyon

#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