gpt4 book ai didi

c++ - 类(class)分配的实现

转载 作者:太空狗 更新时间:2023-10-29 20:58:11 25 4
gpt4 key购买 nike

所以我在浏览一段 C++ 文本时遇到了以下代码:

class example
{
int dataMember;

public:
example& assign(const example& source)
{
if(this!=&source)
{
this->~example();
new (this) example(source);
}


}

};

好的,所以我正在尝试解码这个函数 assign 正在做什么。我所了解的内容:

  1. 该函数获取类实例的常量引用并返回对类的引用。

  2. if block 中,首先调用当前实例的析构函数(据我所知,当前对象被销毁并释放内存)。

    <

现在是主要问题:

新的(这个)例子(source)

这条线让我很困扰。这里发生了什么?如果让我猜,我会说正在创建一个新对象并将其指定为当前对象,因为我可以从 this 关键字推断出来。

谁能解决这个问题?这里到底发生了什么?

这种方法安全吗? (如果分配是动态发生的,程序员将来必须手动释放它)

谢谢。

最佳答案

您看到的是代码重用的尝试。这个想法是使用复制构造函数来实现赋值运算符(或者,在本例中是赋值函数)。

首先,摆脱简单的东西:

  • if 确保正确处理自赋值(例如 x.assign(x))。这是必要的,因为实现依赖于更改 *this 不会更改 source 这一事实。通过将 this 与另一个对象的地址进行比较,这确实测试了对象是否相等,但是否相同。

  • 函数缺少 return *this;,但您可能已经注意到了。

现在到剩下的两行:

this->~example();

显式调用类 example 的析构函数。在该行之后,this 指针不再指向对象,而是指向 sizeof(example) 的未初始化内存。

new (this) example(source);

正所谓placement new ,它分配内存,而只是通过调用其复制构造函数在this 指向的位置创建一个新的example。在某种程度上,这是在不分配任何内存的情况下显式调用构造函数的语法。

请注意,这将重用 *this 之前持有的内存,无论它在哪里:它甚至可以是例如动态分配数组元素的虚拟基...

至于安全性:在实践中,只要构造函数和析构函数都不抛出,这是安全的(尽管很难看并且可能效率不高)。但是,当派生自一个试图偷偷摸摸的类时,您可能会遇到问题。

如果您想知道编写重用复制构造函数的赋值运算符/函数的最简单方法,请查看 this question ,基本上可以归结为:

example& assign(example source)
{
swap(*this, source);
return *this;
}

最重要的区别:

  • 它在适用的地方使用移动构造函数。
  • 如果复制/移动构造函数和 swap 是异常安全的(它们应该始终是),则此代码是异常安全的。
  • 自赋值的效率稍低,因为它会执行复制,而不是识别自赋值。

关于c++ - 类(class)分配的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28252593/

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