gpt4 book ai didi

c++ - 复制构造函数和动态内存

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:27 26 4
gpt4 key购买 nike

我是编程初学者,正在学习复制构造函数。从不同的来源我可以看到,如果我想“深度复制”一个类对象,那么复制构造函数很有用,这样新对象的指针成员将指向新的内存位置。

我的问题是,如果我使用空复制构造函数(如 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 概念,你只有结构和原始指针。一个指针可以被拥有,在这种情况下拷贝必须很深,或者它可以被共享,在这种情况下拷贝很浅(如果它是用 malloc 分配的,你必须小心释放它)。

在 C++ 中,new 现在实际上已被弃用。我们有独特的指针,分别是“拥有指针”和“共享指针”。但是,指针相对较少。类的数组成员是std::vectors,字符串成员是std::strings。并且拷贝是自动深的,(如果你想要一个浅拷贝,你可以使用引用)。

指针在相对不寻常的情况下被阻止,例如树和图形。

关于c++ - 复制构造函数和动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42102332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com