虽然使用赋值运算符是相当简单的,正确实施重载赋值运算符可能比你预期的更微妙的一点。有两个主要的原因。首先,在某些情况下,赋值操作符不打电话的时候,你可能会想到这是。第二,在处理动态分配的内存有问题(我们会在下一堂课上盖)。
赋值操作符用于复制的值从一个对象到另一个已存在的对象。这里的关键词是“已经存在”。考虑下面的例子:
Cents cMark(5); // calls Cents constructor
Cents cNancy; // calls Cents default constructor
cNancy = cMark; // calls Cents assignment operator
在这种情况下,cnancy已经被时间的分配被执行了。因此,赋值操作符被称为仙。赋值操作符必须重载为成员函数。
如果被复制到该对象不存在,会发生什么?理解在这种情况下会发生什么,我们需要谈谈复制构造函数。
复制构造函数
考虑下面的例子:
1
2
Cents cMark(5); // calls Cents constructor
Cents cNancy = cMark; // calls Cents copy constructor!
因为第二句使用一个等于符号的话,你可能会认为它调用赋值运算符。然而,它不!它实际上是一种特殊类型的构造函数调用调用复制构造函数。复制构造函数是一种特殊的构造函数来初始化一个新对象从现有的对象。
复制构造函数的目的和赋值操作符相当-复制一个对象到另一个。然而,赋值操作符复制到现有对象,并复制构造函数复制到新创建的对象。
与复制构造函数和赋值操作符产生许多新的程序员混淆的差异,但这真的不是那么难。总结: