C++ Ile Nesne Yönelimli Programlama (Kopya Yapıcı)

Aslihan Akbiyik
2 min readOct 16, 2020

--

Bu yazılar https://www.tutorialspoint.com/cplusplus/ adresindeki yazı dizilerinin çevirileridir.

Kopya yapıcı, bir nesneyi daha önce yaratılmış olan aynı sınıftaki bir nesneyle başlatarak nesne yaratan bir yapıcıdır. Kopya yapıcı -

-Bir nesneyi aynı tipli diğer bir nesneden başlatmak

-Bir nesneyi bir fonksiyona argüman olarak çağırmak için kopyalamak

-Bir nesneyi bir fonksiyonda döndürmek için kopyalamak

gibi işlemlerde kullanılır.

Eğer bir kopya oluşturucu bir sınıfta tanımlanmamışsa, derleyici kendi kendine bir tane tanımlar. Eğer sınıf işaretçi değişkenler içeriyorsa ve dinamik hafıza tahsisi varsa, bu sınıfın bir kopya yapıcısı olmalıdır. Kopya yapıcının en yaygın kullanımı aşağıda gösterilmiştir -

sinifadi (const sinifadi &nesne) {

//yapıcının gövdesi

}

Burada, nesne diğer nesneyi başlatmak için kullanılan bir referanstır.

#include <iostream>

using namespace std;

class Satir {

public:

int uzunluguAl( void );

Satir( int uzn ); // basit bir yapıcı

Satir( const Satir &nesne); // kopya yapıcı

~Satir(); // yıkıcı

private:

int *ptr;

};

// Yapıcı içeren üye fonksiyon tanımları

Satir::Satir(int uzn) {

cout << “Normal yapici ptr’ye yer ayiriyor” << endl;

// pointer için hafıza ayrımı;

ptr = new int;

*ptr = uzn;

}

Satir::Satir(const Satir &nesne) {

cout << “Kopya yapici ptr’ye yer ayiriyor.” << endl;

ptr = new int;

*ptr = *nesne.ptr; // değeri kopyaladı

}

Satir::~Satir(void) {

cout << “Hafizadaki yeri serbest birakiyor!” << endl;

delete ptr;

}

int Satir::uzunluguAl( void ) {

return *ptr;

}

void goster(Satir nesne) {

cout << “Satirlarin uzunlugu : “ << nesne.uzunluguAl() <<endl;

}

// Programın ana fonksiyonu

int main() {

Satir satir(10);

goster(satir);

return 0;

}

Kod derlenip çalıştırıldığında, aşağıdaki sonuç açığa çıkar -

Normal yapici ptr’ye yer ayiriyor

Kopya yapici ptr’ye yer ayiriyor.

Satirlarin uzunlugu : 10

Hafizadaki yeri serbest birakiyor!

Hafizadaki yeri serbest birakiyor!

Aynı örneği ufak değişiklikle mevcut nesneyle başka bir nesne oluşturarak görelim -

#include <iostream>

using namespace std;

class Satir {

public:

int uzunluguAl( void );

Satir( int uzn ); // basit bir yapıcı

Satir( const Satir &nesne); // kopya yapıcı

~Satir(); // yıkıcı

private:

int *ptr;

};

// Yapıcı içeren üye fonksiyon tanımları

Satir::Satir(int uzn) {

cout << “Normal yapici ptr’ye yer ayiriyor” << endl;

// pointer için hafıza ayrımı;

ptr = new int;

*ptr = uzn;

}

Satir::Satir(const Satir &nesne) {

cout << “Kopya yapici ptr’ye yer ayiriyor.” << endl;

ptr = new int;

*ptr = *nesne.ptr; // değeri kopyaladı

}

Satir::~Satir(void) {

cout << “Hafizadaki yeri serbest birakiyor!” << endl;

delete ptr;

}

int Satir::uzunluguAl( void ) {

return *ptr;

}

void goster(Satir nesne) {

cout << “Satirlarin uzunlugu : “ << nesne.uzunluguAl() <<endl;

}

// Programın ana fonksiyonu

int main() {

Satir satir1(10);

Satir satir2 = satir1; // Aynı zamanda kopya oluşturucuyu çağırır

goster(satir1);

goster(satir2);

return 0;

}

Kod derlenip çalıştırıldığında, takip eden sonucu elde deriz -

Normal yapici ptr’ye yer ayiriyor

Kopya yapici ptr’ye yer ayiriyor.

Kopya yapici ptr’ye yer ayiriyor.

Satirlarin uzunlugu : 10

Hafizadaki yeri serbest birakiyor!

Kopya yapici ptr’ye yer ayiriyor.

Satirlarin uzunlugu : 10

Hafizadaki yeri serbest birakiyor!

Hafizadaki yeri serbest birakiyor!

Hafizadaki yeri serbest birakiyor!

https://www.tutorialspoint.com/cplusplus/cpp_copy_constructor.htm

--

--

Aslihan Akbiyik

ICS Infrastructure Assistant Specialist @SOCAR | aslihana.bandcamp.com/