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

How do I properly overload a operator= when creating a 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 语句 her 及其作用,还有另一种方法可以正确重载 operator=,为什么我们 returning class 运算符重载中的引用?如果我们 return 按值而不是按引用会出错吗?此外,什么时候复制东西是个坏主意,因为我已经阅读了很多关于复制如何导致内存泄漏的内容,但我从未见过这样的事件,所以我不知道该怎么做。如有任何帮助,我们将不胜感激!

这与复制构造函数无关。

这是在检查对象被分配给自身时的边缘情况:

MyClass c;

// Some code

c=c;

c=c 是完全有效的 C++。您可以将一个对象分配给它自己。据推测,您希望它什么都不做。这个对象没有改变。

与赋值运算符中的 this 的比较是在复制构造函数被调用进行自赋值时赋值运算符本身会严重崩溃时完成的。如果,在这种情况下,sthis.

是同一个对象

并没有规定赋值运算符必须进行这种比较。许多赋值运算符重载工作得非常好,即使在将对象分配给自身时也是如此。

但是无论这个赋值运算符做什么,如果赋值是来自它自己,它就不会起作用。您未能展示此赋值运算符的作用,但它调用名为 remove 的东西这一事实是一个重要的线索。它从对象中删除了一些东西,所以如果没有这个检查,将这个对象分配给它自己将会使它完全“空”。这样做是相当粗鲁的,你不同意吗?

曾经有一个过时的成语叫Rule of Big 3。 该规则的推荐实施是另一个过时的 Copy+Swap Idiom。这些习语为初学者 C++ 程序员提供了很好的起点。稍后您可能会发现更好的权衡和针对特殊情况的优化替代方案。现在,坚持旧的习语 - 至少 - 可以提高代码功能和正确性的保证。

干杯, 调频.