Я начинаю программировать, и я изучаю конструкторы копирования. Из разных источников я вижу, что конструкторы копирования полезны, если я хочу «глубоко скопировать» объект класса, чтобы члены указателя нового объекта указывали на новые ячейки памяти.Копировальный конструктор и динамическая память
Вопрос в том, в чем заключается преимущество определения конструктора копирования, как в классе CopyCat, в моем примере, если я получаю тот же результат с пустым конструктором копии (как в классе EmptyCat)?
Мой второй вопрос: почему класс Cat и класс EmptyCat работают по-другому? Единственное различие между ними заключается в том, что я определяю пустой конструктор копирования в EmptyCat. Но когда я запускаю программу, я вижу, что в EmptyCat после копирования элемент указателя указывает на новое местоположение, а в классе Cat - на мелкой копии.
#include "iostream"
class Cat
{
public:
void GetMem() { std::cout << itsAge << "\n"; }
private:
int * itsAge = new int;
};
class EmptyCat
{
public:
EmptyCat() {}
~EmptyCat() {}
EmptyCat(EmptyCat&obj) {}
void GetMem() { std::cout << itsAge << "\n"; }
private:
int * itsAge = new int;
};
class CopyCat
{
public:
CopyCat() {}
~CopyCat() {}
CopyCat(CopyCat&obj);
int GetAge() { return *itsAge; }
void GetMem() { std::cout << itsAge << "\n"; }
private:
int * itsAge = new int;
};
CopyCat::CopyCat(CopyCat & obj)
{
itsAge = new int;
*itsAge = obj.GetAge();
}
int main()
{
Cat Garfield;
Cat Kitty(Garfield);
std::cout << "Memory addresses for the objects' <itsAge> member:" << std::endl;
std::cout << "Garfield and Kitty (Class Cat):" << std::endl;
Garfield.GetMem();
Kitty.GetMem();
EmptyCat Meow;
EmptyCat Purr(Meow);
std::cout << std::endl << "Meow and Purr (Class EmptyCat):" << std::endl;
Meow.GetMem();
Purr.GetMem();
CopyCat Fluffy;
CopyCat Felix(Fluffy);
std::cout << std::endl << "Fluffy and Felix (Class CopyCat):" << std::endl;
Fluffy.GetMem();
Felix.GetMem();
system("pause");
return 0;
}
При запуске программы я получаю это:
Memory addresses for the objects' <itsAge> member:
Garfield and Kitty (Class Cat):
00BBDA60
00BBDA60
Meow and Purr (Class EmptyCat):
00BB46A0
00BB8280
Fluffy and Felix (Class CopyCat):
00BB82B0
00BBE8A0
Press any key to continue . . .
Ваш класс утечки памяти, поэтому это не очень хороший пример чего-либо. –
Я хотел сделать это как можно проще, сосредоточившись на поведении конструктора копий – SVG
Но при этом вам не хватает всего интересного. Если ваш деструктор должен был удалить выделение, вы сразу обнаружите правило из трех и все такое. –