Može li mi itko reći za što se koristi kopirni instruktor i ako možete dati koji primjer :)
Kopirni konstruktor se koristi za slučaj deep copy tj. kada se u klasi nalaze pokazivači. Npr;
#include <iostream>
using namespace std;
class Student{
private:
char* JMBG;
public:
// konstruktor s parametrom
Student(char* jmbg){
JMBG = new char[11];
strcpy(JMBG, jmbg);
}
// kopirni konstruktor
// Student(const Student& s){
// JMBG = new char[11];
// strcpy(JMBG, s.GetJMBG());
// }
char* GetJMBG() const{
return &JMBG[0];
}
void SetJMBG(char* noviJMBG){
strcpy(JMBG, noviJMBG);
}
//destruktor
~Student(){
delete JMBG;
}
};
int main(){
Student Ante("1122334455");
Student Ivica = Ante; // poziv kopirnog konstruktora!
cout << Ante.GetJMBG() << endl; // 1122334455
cout << Ivica.GetJMBG() << endl; // 1122334455
Ante.SetJMBG("6677889900");
cout << Ante.GetJMBG() << endl; // 6677889900
cout << Ivica.GetJMBG() << endl; // 6677889900 ?!?! a trebao bi biti 1122334455
return 0;
}
U ovom primjeru u funkciji main se poziva defaultni kopirni konstruktor koji radi shallow copy. Problem s time je da sada Ante i Ivica dijele isti pokazivač (JMBG). Iz tog razloga kada se mijenja JMBG Anti odmah se mijenja i Ivici. Da bi se to spriječilo mora se napraviti deep copy tj. napisati vlastitu implementaciju kopirnog konstruktora koji će za svaki pokazivač u klasi napraviti novu memorijsku lokaciju.
Kada prvi put pokreneš ovaj program izbaciti će ti kao u komentarima (isti JMBG za Antu i Ivicu), a gore (komentirano u klasi) je napisana implementacija kopirnog konstruktora koja će riješiti ovaj problem (Ivičin JMBG se neće mijenjati jer više ne dijeli pokazivač JMBG s Antom).