Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建复制构造函数时,如何正确重载运算符= 我在我的大学里有一个C++课程的讲座,我真的不知道操作员应该做什么以及如何适当地重载它。在我能找到的几乎所有讲座示例中,复制和移动构造函数的代码部分如下所示: 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._C++_Operator Overloading_Copy Constructor - Fatal编程技术网

创建复制构造函数时,如何正确重载运算符= 我在我的大学里有一个C++课程的讲座,我真的不知道操作员应该做什么以及如何适当地重载它。在我能找到的几乎所有讲座示例中,复制和移动构造函数的代码部分如下所示: 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.

创建复制构造函数时,如何正确重载运算符= 我在我的大学里有一个C++课程的讲座,我真的不知道操作员应该做什么以及如何适当地重载它。在我能找到的几乎所有讲座示例中,复制和移动构造函数的代码部分如下所示: 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.,c++,operator-overloading,copy-constructor,C++,Operator Overloading,Copy Constructor,现在我的问题是,为什么会有一个if语句,它是做什么的,还有没有其他方法可以正确重载操作符=,为什么我们要在操作符重载中返回一个类引用?如果我们按值返回而不是按引用返回,会是一个错误吗?还有,什么时候复制东西是个坏主意,因为我读了很多关于复制如何导致内存泄漏的书,但我从未见过这样的事件,所以我不知道该怎么办。任何帮助都将不胜感激 这与复制构造函数无关 这是在将对象指定给自身时检查边缘情况: MyClass c; // Some code c=c; C= C 完全正确的C++。可以将对象指

现在我的问题是,为什么会有一个if语句,它是做什么的,还有没有其他方法可以正确重载操作符=,为什么我们要在操作符重载中返回一个类引用?如果我们按值返回而不是按引用返回,会是一个错误吗?还有,什么时候复制东西是个坏主意,因为我读了很多关于复制如何导致内存泄漏的书,但我从未见过这样的事件,所以我不知道该怎么办。任何帮助都将不胜感激

这与复制构造函数无关

这是在将对象指定给自身时检查边缘情况:

MyClass c;

// Some code

c=c;

<代码> C= C 完全正确的C++。可以将对象指定给其自身。想必,你认为这不会起什么作用。这个对象不会改变

在赋值运算符中与
this
进行比较时,如果复制构造函数被调用进行自赋值,赋值运算符本身将严重中断。如果在这种情况下,
s
是与
相同的对象

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


但是无论这个赋值操作符做什么,如果赋值来自它自己,它都不会工作。您未能显示此赋值运算符的功能,但它调用名为
remove
的内容这一事实是一个很大的提示。它会从对象中删除某些内容,因此如果不进行此检查,则将此对象分配给自身将使其完全“空”。你不同意吗?

有一个过时的成语叫。 建议执行这一规则是另一个过时的做法。这些习语为初学者C++程序员提供了很好的起点。稍后,您可能会发现更好的折衷方案,并针对特殊情况优化备选方案。目前,坚持旧习惯用法至少可以改善对代码功能和正确性的保证

干杯,
FM.

测试使写入
a=a无害。非常感谢您的回复,并为我澄清了一些事情。我一直在想,每次定义复制构造函数时都必须重载一个=运算符。这个检查是应该做的吗?如果没有它,程序会正常工作吗?再次感谢!通常,当图片中有复制构造函数时,也需要赋值运算符,但仅出于相同的基本原因,而不一定要实现复制构造函数。没有法律规定当存在复制构造函数时必须实现赋值运算符。但是,根据赋值运算符实现复制构造函数是一种相当常见的方法。我在回答中解释了做这个检查的原因。同样,没有法律规定必须在每个赋值运算符中执行此操作。但其中一些国家必须这样做。