c++ - 如何在创建复制构造函数时正确重载 operator=

标签 c++ operator-overloading copy-constructor

我在我的大学里有一个关于 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 的比较如果复制构造函数被调用以进行自赋值,则赋值运算符本身会严重中断时完成赋值运算符。如果,在这种情况下,sthis 是同一个对象.
没有法律规定赋值运算符必须进行这种比较。许多赋值运算符重载工作得非常好,即使将对象分配给自身也是如此。
但是无论这个赋值运算符做什么,如果赋值来自它自己,它就不起作用。您未能展示此赋值运算符的作用,但事实上它调用了名为 remove 的东西。是一个很大的鸣喇叭线索。它从对象中删除某些东西,因此如果没有此检查,将这个对象分配给它自己会使其完全“空”。这将是一件相当粗鲁的事情,你不同意吗?

关于c++ - 如何在创建复制构造函数时正确重载 operator=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64796012/

相关文章:

c++ - 在里面。静态成员,而 COPY CTOR 是私有(private)的

c++ - lambda 如何在 MSVC2017 15.9.3 with/std :c++17? 中使用静态本地错误返回值

actionscript-3 - AS3 中的重载 [] 运算符

c++ - 如何利用模板复制和移动构造函数和赋值运算符?

c++ - 一元 + on 指针

c++ - 自定义有序集给出 "invalid operator<"的查找(...)

c++复制构造函数中的用户定义成员

c++ - 在 C++ 中使用 Boost-Python 访问 Python 中定义的函数数组

c++ - 桥接 USB 主机到设备

c++ - 跨不同平台的基本类型的能力