gpt4 book ai didi

C++ 编译器 'shallow' 拷贝和赋值

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:06 26 4
gpt4 key购买 nike

我正在上一门关于使用 C++ 进行面向对象编程的类(class)。

在我们的文字中说,

If we do not declare a copy constructor, the compiler inserts codethat implements a shallow copy. If we do not declare an assignmentoperator, the compiler inserts code that implements a shallowassignment.

我想知道的是,这是否属实,所提到的编译器机制实际上调用了什么,以及它是如何工作的。

不是关于复制构造函数的问题,而是关于编译器行为的问题。

EDIT> 更多上下文

复制构造函数如文本所定义:

The definition of a copy constructor contains logic that

  1. performs a shallow copy on all of the non-resource instance variables
  2. allocates memory for each new resource
  3. copies data from the source resource(s) to the newly created resource(s)

资源由文本定义

Memory that an object allocates at run-time represents a resource of thatobject's class.

The management of this resource requires additional logic that was unnecessary for simpler classes that do not access resources. This additional logicensures proper handling of the resource and is often called deep copying andassignment.

最佳答案

更准确的说法是编译器定义了一个默认复制构造函数和一个默认复制赋值运算符。这些将通过简单地为所有成员变量调用复制构造函数来复制/构造新对象。

  • 对于像 intfloat 这样的原语,这通常不是问题。
  • 不过,对于指针。这是个坏消息!当第一个对象删除该指针时会发生什么?现在其他对象的指针无效了!
  • 如果无法复制成员变量(也许您使用了 std::unique_ptr 来解决上述问题),那么默认的复制赋值/ctor 将不起作用。你怎么能复制无法复制的东西?这将导致编译器错误。

如果您定义自己的复制构造函数/赋值运算符,则可以进行“深复制”。您可以:

  • 创建一个新对象,而不是复制指针
  • 明确地“浅拷贝”一个指针
  • 根据您的实际需要将以上两者混合使用!
  • 使用复制对象中的默认/自定义值初始化成员变量,而不是复制原始对象中的任何内容。
  • 完全禁止复制
  • 一直持续不断

如您所见,您有很多理由想要实现(或明确禁止)您自己的复制赋值运算符、复制构造函数、它们的移动对应物和析构函数。事实上,有一个著名的 C++ 习语称为 The Rule of Five (以前称为 3 规则)可以指导您决定何时执行此操作。

关于C++ 编译器 'shallow' 拷贝和赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33286509/

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