gpt4 book ai didi

c++ - 复制赋值运算符说明

转载 作者:行者123 更新时间:2023-12-02 08:15:37 25 4
gpt4 key购买 nike

我正在为我创建的类编写一个复制赋值运算符,并使用上一篇文章作为指导: What is The Rule of Three?

我对这个人的解释的一方面有点困惑。

这是他们的类(class):

class person
{
char* name;
int age;
};

这是我用作引用的复制赋值运算符定义(至少提供了 2 个):

// 2. copy assignment operator
person& operator=(const person& that)
{
char* local_name = new char[strlen(that.name) + 1];
// If the above statement throws,
// the object is still in the same state as before.
// None of the following statements will throw an exception :)
strcpy(local_name, that.name);
delete[] name;
name = local_name;
age = that.age;
return *this;
}

我感到困惑的是,为什么它们包含行 delete[] name;

这是他们提供的另一个示例:

person& operator=(const person& that)
{
if (this != &that)
{
delete[] name;
// This is a dangerous point in the flow of execution!
// We have temporarily invalidated the class invariants,
// and the next statement might throw an exception,
// leaving the object in an invalid state :(
name = new char[strlen(that.name) + 1];
strcpy(name, that.name);
age = that.age;
}
return *this;
}

我立即回避了这个,因为我无法理解为什么该函数会检查 if(this != &that) 然后在一个不存在的数组上运行 delete (delete[] name;)好像还没有生成。当调用赋值运算符时,是否在调用复制赋值运算符函数之前立即调用常规构造函数?因此,这意味着我们必须删除由类构造函数生成的数组,因为它只能充满垃圾数据?

为什么我不能直接写:名称 = that.name

name = new char[that.name.size()];
for (int i = 0; i < that.name.size(); i++)`
{
name[i] = that.name[i]
}

这可能真的很基本,我应该只实现帖子建议的内容,但我的实际用例涉及具有多个成员的struct数组,所以我只是遇到了一点困难了解我到底需要做什么。

我意识到这里有大约 2.5 个问题。任何见解将不胜感激。

这是我第一次实现自定义复制构造函数和复制赋值运算符,我确信在完成几次后它会看起来很容易。

提前致谢。

最佳答案

所有这些都是确保内存得到正确管理所必需的。

如果我理解正确,您需要回答何时实际调用 operator=
好吧,当存在两个有效对象时,operator= 总是被调用。其中之一是分配给,第二个是数据源。执行此操作后,两个对象必须仍然有效

这意味着在 operator= 内部,您有 this 对象,该对象为字符串分配了内存(在构造函数之一中分配)和 that 对象,还为另一个字符串分配了内存。

What I'm finding confusing is, why are they including the line delete[] name;?

我们必须首先清理当前驻留在 this 对象中的内存,否则在为它分配新的 momry 后我们将丢失该指针。

When the assignment operator is invoked, is the regular constructor called immediately before the copy assignment operator function is called?

没有。该对象已经存在,这就是调用 operator= 的原因(而不是复制构造函数)。

Therefore meaning that we must delete the array that was generated by the classes constructor because it can only be full of junk data?

它充满了有效数据。您的对象已构造完毕,其中包含一些数据,然后您可以为该对象分配其他内容。

<小时/>

附录:何时调用复制构造函数以及何时调用 operator=(有关更多详细信息,请参阅 this question):

class A{};

int main()
{
A a1; //default constructor
A a2 = a1; //copy-constructor, not assignment operator! New object is needed

A a3;
a3 = a1; //we have valid and existing object on the left side, assignment operator is used
}

关于c++ - 复制赋值运算符说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59364218/

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