【发布时间】:2017-06-25 10:25:01
【问题描述】:
我是编程初学者,我正在学习复制构造函数。从不同的来源我可以看到,如果我想“深度复制”一个类对象,那么复制构造函数很有用,这样新对象的指针成员将指向新的内存位置。
我的问题是,如果我使用空的复制构造函数(如在 EmptyCat 类中)得到相同的结果,那么像在我的示例中的类 CopyCat 中那样定义复制构造函数有什么好处?
我的第二个问题是,为什么 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 . . .
【问题讨论】:
-
你的类泄漏了内存,所以它不是一个很好的例子。
-
我想让它尽可能简单,重点关注复制构造函数的行为
-
但是这样做你会错过所有有趣的东西。如果你的析构函数要删除分配,你会立即发现三规则等等。
标签: c++ copy-constructor deep-copy