位定义(C 浅副本)
bit by bit definition (c++ shallow copy)
所以我很快就会进行检查,并瞥了一眼我的笔记,老师说浅副本是用一点副本定义的。我对浅副本和深副本都了解,但我不知道应该有什么意思。并非所有计算机数据存储为位吗?该定义是否可以暗示在复制数据时实现bortream期间?有人知道这个"有点"术语的知识?谢谢
说您有两个变量MyObj a, b;
。如果a = b
执行浅副本,则变量b
中的位现在将与变量a
中的位相同。特别是,如果MyObj
包含任何指针或引用,则在a
和b
中都相同。指向或提到的对象未复制。
位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::copy
在my_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类型)兼容的数据类型均可复制。
相比之下,浅层复制及其反行局的深层复制仅是由于对象关系的问题而存在的。
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 隐式定义的副本分配运算符
- 位定义(C 浅副本)
- 用运算符=(assign)定义部分副本是个好主意吗
- 具有未定义参数的私有副本构造函数
- 为什么在副本分配运算符的定义中需要删除
- 使用已删除的副本构造函数和初始值设定项列表重载调用类定义中的成员构造函数
- 创建自定义" string "(结构)副本