位定义(C 浅副本)

bit by bit definition (c++ shallow copy)

本文关键字:副本 定义      更新时间:2023-10-16

所以我很快就会进行检查,并瞥了一眼我的笔记,老师说浅副本是用一点副本定义的。我对浅副本和深副本都了解,但我不知道应该有什么意思。并非所有计算机数据存储为位吗?该定义是否可以暗示在复制数据时实现bortream期间?有人知道这个"有点"术语的知识?谢谢

说您有两个变量MyObj a, b;。如果a = b执行浅副本,则变量b中的位现在将与变量a中的位相同。特别是,如果MyObj包含任何指针或引用,则在ab中都相同。指向或提到的对象未复制。

位copy/shallow copy

以指向大量数据的指针为例:

int* my_ints = new int[1000];

my_ints指向跨越一千 int s的内存区域的开始

当您做

int* his_ints = my_ints;

my_ints的值复制到his_ints,即my_ints的位已复制到his_ints。这意味着his_ints还指向了同一内存区域的开始,my_ints也指向。因此,通过做

his_ints[0] = 42;

my_ints[0]也将是42,因为它们都指向相同的数据。这就是您的教授很可能被称为"刻度"复制,通常也称为"浅副本"。复制指针和参考时,这主要是遇到的(您无法从技术上复制引用,但是您可以将引用绑定到绑定到另一个参考的变量)。

深副本

现在,您可能不想逐个复制行为。例如,如果您想要副本,并且要修改该副本而不修改源。为此,您进行了深层副本。

int* my_ints = new int[1000];
int* his_ints = new int[1000];
std::copy(my_ints, my_ints + 1000, his_ints);

std::copymy_ints指向内存的区域中复制了int s,并将其指向his_ints指向的内存区域。现在,如果您这样做

my_ints[0] = 42;
his_ints[0] = 90;

my_ints[0]his_ints[0]现在将具有不同的值,因为它们现在指向各自和不同的内存领域。

在C ?

中如何关系

当您拥有C 类时,应正确定义其构造函数。与主题相关的一个构造函数是复制构造函数(注意:这也适用于复制分配运算符)。如果仅让编译器生成默认复制构造函数,则它只是进行数据浅的副本,包括可能指向内存区域的指针。

class Example {
public:
    int* data;
    Example() {
       data = new int[1000];
    }
    Example(const Example&) = default;   // Using C++11 default specifier
    ~Example() {
       delete[] data;
    }
};
// Example usage
{
   Example x;
   Example y = x;   // Shallow copies x into y
   assert(x.data == y.data);
   // y's destructor will be called, doing delete[] data.
   // x's destructor will be called, doing delete[] data;
   //   This is problematic, as you are doing delete[] twice on the same data.
}

要解决问题,您必须执行数据的深层副本。为了完成此操作,您必须自己定义复制构造函数。

Example(const Example& rhs) {
   data = new int[1000];
   std::copy(data, data + 1000, rhs.data);
}

有关更多信息和更好的解释,请查看三个规则是什么?。

我将逐个定义的副本定义为分配给对象的信息的传输,作为一个非结构化的内存块。在简单结构的情况下,这很容易想象。

源结构的内容是什么?它们是初始化的吗?它与其他对象有什么关系?所有不重要的。

从某种意义上说,逐个副本就像浅副本一样,就像浅副本逐个副本不会重复相关的对象,但这是因为它甚至都不考虑对象关系。

例如,C 将琐碎的复制构造函数定义为

琐碎的复制构造函数是一个构造函数,它可以创建参数对象表示的字节副本,并且没有执行其他操作。可以通过手动复制其对象表示,例如与std :: memmove。所有与C语言(POD类型)兼容的数据类型均可复制。

相比之下,浅层复制及其反行局的深层复制仅是由于对象关系的问题而存在的。