我在我的大学里有一个关于 C++ 的讲座,我无法真正理解 operator= 应该做什么以及如何正确地重载它。在我能找到的几乎所有讲座的示例中,复制和移动构造函数的代码部分如下所示:
class MyClass {
MyClass(const MyClass& s) {
copy(s); // the function is supposed to do the copying.
}
MyClass& operator=(const MyClass& s){
if(this != &s){ remove(); copy(s);} // the remove function is defined later on in the code, and it
return *this;} deletes a given pointer.
现在我的问题是,为什么她有一个 if 语句以及它做了什么,还有另一种方法可以正确地重载 operator=,为什么我们在运算符重载中返回一个类引用?如果我们按值而不是按引用返回它会是一个错误吗?另外,什么时候复制东西是个坏主意,因为我已经阅读了很多关于复制如何导致内存泄漏的信息,但我从未见过这样的事件,所以我不知道该怎么做。任何帮助将不胜感激!
最佳答案
无论如何,这与复制构造函数无关。
这是在将对象分配给自身时检查边缘情况:
MyClass c;
// Some code
c=c;
c=c
是完全有效的 C++。您可以将对象分配给自身。大概,您希望这不会做任何事情。这个对象不会改变。与
this
的比较如果复制构造函数被调用以进行自赋值,则赋值运算符本身会严重中断时完成赋值运算符。如果,在这种情况下,s
与 this
是同一个对象.没有法律规定赋值运算符必须进行这种比较。许多赋值运算符重载工作得非常好,即使将对象分配给自身也是如此。
但是无论这个赋值运算符做什么,如果赋值来自它自己,它就不起作用。您未能展示此赋值运算符的作用,但事实上它调用了名为
remove
的东西。是一个很大的鸣喇叭线索。它从对象中删除某些东西,因此如果没有此检查,将这个对象分配给它自己会使其完全“空”。这将是一件相当粗鲁的事情,你不同意吗?
关于c++ - 如何在创建复制构造函数时正确重载 operator=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64796012/