Ezt elmagyarázná valaki? Másoló konstruktor C++ .
A forráskód:
//main.cpp
# include <iostream>
# include <stdlib.h>
typedef unsigned short ushort;
typedef unsigned int uint;
using std::cout;
using std::cin;
using std::endl;
class SIMPLECAT
{
public:
SIMPLECAT();
SIMPLECAT(const SIMPLECAT&);
~SIMPLECAT();
int GetAge()const {return *itsAge;}
int GetWeight()const {return *itsWeight;}
void SetAge(int age) {*itsAge = age;}
private:
int *itsAge;
int *itsWeight;
};
SIMPLECAT::SIMPLECAT():
itsAge(new int(4)),
itsWeight(new int(3))
{cout <<"Konstruktor \n";}
SIMPLECAT::SIMPLECAT(const SIMPLECAT &rhs)
{
cout <<"Copy Konstruktor \n";
itsAge = new int;
itsWeight = new int;
*itsAge = rhs.GetAge();
*itsWeight = rhs.GetWeight();
}
SIMPLECAT::~SIMPLECAT()
{
cout <<"Destruktor \n";
delete itsAge;
itsAge = NULL;
delete itsWeight;
itsWeight = NULL;
}
int main()
{
SIMPLECAT Bolyhos;
cout <<"Bolyhos s age: "<< Bolyhos.GetAge() << endl
<<"Setting Bolyhos to 6 ... \n";
Bolyhos.SetAge(6);
cout <<"Creating Boots from Bolyhos \n";
SIMPLECAT Boots(Bolyhos);
cout <<"Bolyhos s age: "<< Bolyhos.GetAge() << endl
<<"Boots s age: "<< Boots.GetAge() << endl
<<"Setting Bolyhos to 7 ... \n";
Bolyhos.SetAge(7);
cout <<"Bolyhos s age: "<< Bolyhos.GetAge() << endl
<<"Boots s age: "<< Boots.GetAge() << endl;
return EXIT_SUCCESS;
}
Ahogy én tudom:
Itt létrehozzuk a Bolyhos macskát.
Majd létrehozzuk a Boots macskát is úgy,hogy..... nem tudom tovább folytatni :( .
De azt tudom,hogy ilyenkor 'SIMPLECAT Boots(Bolyhos;)' meghívódik a másoló konstruktor.A másoló konstruktor bemenő paramétere egy hivatkozás tehát a Bolyhosnak a másoló konstruktoron belül lesz egy név változata az rhs.
Ezt értem.
A másoló konstruktorban dinamikuson foglalunk le memóriaterületet.
De nem értem itt miért nem lesz memória elszivárgás hisz a régi memóriaterületet nem szabadítjuk fel hanem egyből új memóriaterületet foglalunk le a másoló konstruktorban.
Á már a kérdésemet sem értem :(
Bár nem fogod érteni a válaszom (legalábbis eddig sosem értetted), de azért megpróbálom.
A másoló konstruktorban egy meglévő objektumból létrehozol egy újat. Az újban létrehozol a dinamikus memóriában egy "üres" intet, majd annak az értékét felülírod a már létező objektumból kimásolt értékkel. A meglévő objektum intjeit te nem változtatgatod, nem is tehetnéd, hiszen annak az objektumnak tovább kell élnie. Ráadásul const is.
Bár kicsit furán csinálod a dolgokat, de szivárgás nincs: amit lefoglalsz azt a destruktorban fel is szabadítod.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!