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

标签 c++ copy-constructor deep-copy

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

我的问题是,如果我使用空复制构造函数(如在类 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::vector,字符串成员是 std::string。并且拷贝自动是深拷贝(如果您想要浅拷贝,则可以使用引用)。

对于相对不寻常的情况(例如树和图),指针会被保留。

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

相关文章:

c++ - 从内联函数调用中调用内联函数?

c++ - 如何将 bool 类型转换为const char *

c++ - 原生 C++ 中的类 C# 属性?

c++ - 为什么不只有一个?复制构造函数和赋值运算符

c - 连续录制音频的内存问题

c++ - 3D - 来自方向 vector (向前、向上、向右)的旋转矩阵

c++ - 为什么使用 Lambdas/Closures 调用 CopyConstructor?

c++ - 错误消息 : with Copy constructor and Overloaded assignment operator

java - 深度复制图结构

python - 无法在 Python 类中使用方法列表,它会破坏深度复制。解决方法?