Top Banner
C++ Dersi: Nesne Tabanlı Programlama Çiğdem Turhan Fatma Cemile Serçe Bölüm 10: Yapıcı ve Yıkıcı Fonksiyonlar
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

Sep 06, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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