// Overloaded assignment operator for CMessage objects
CMessage& operator=(const CMessage& aMess)
{
if(this == &aMess) // Check addresses, if equal
return *this; // return the 1st operand
// Release memory for 1st operand
delete[] pmessage;
pmessage = new char[strlen(aMess.pmessage) + 1];
// Copy 2nd operand string to 1st
strcpy_s(this- > pmessage, strlen(aMess.pmessage)+1, aMess.pmessage);
// Return a reference to 1st operand
return *this;
}
当使用运算符重载时,该示例使用reference作为参数,当比较地址是否相等时,为什么使用&在aMess上,为什么不使用if(this == aMess)?是&a; aMess是一个参考地址?
答案 0 :(得分:2)
& aMess是一个参考地址吗?
是
if(this == &aMess)
用于通过比较它们的地址来检查它们是否是同一个对象。
if(*this == aMess)
用于通过比较它们的值来检查它们是否相等。
为什么不使用if(this == aMess)?
if(this == aMess)
没有意义,因为它们的类型不同。
答案 1 :(得分:0)
是的,这在C ++中令人困惑。在您的示例中,aMess是对对象的引用。在代码中使用名称aMess在语法上与使用原始对象本身相同,因此您无法将其与作为指针的this
进行比较。要与this
进行比较,必须将引用转换为指针,这是使用&
运算符完成的。就像普通物体一样。
答案 2 :(得分:0)
使用运算符重载时,该示例使用reference作为参数
这是对的。它需要引用单个对象,而不是指向对象或对象数组的(可能为null)指针。此外,它是const
引用,因为该函数不会改变原始函数。
比较地址是否相等时,为何使用&在aMess,
因为&aMess
是aMess
的地址。根据定义,具有相同地址的指针指向同一对象。
为什么不使用if(this == aMess)?
将指针(this
)与引用(aMess
)进行比较,除非CMessage::operator CMessage* ()
存在,否则不会编译(希望它不会)。如果想要比较对象的值,他们会写if(*this == aMess)
,如果存在则调用bool CMessage::operator ==(const CMessage&)
,或者如果不存在则对对象进行二进制比较。
& aMess是一个参考地址吗?
它是对象的地址。将一元&
应用于引用与将其应用于引用对象的方法相同。
本练习的重点是CMessage
类中有堆分配的存储空间(由pmessage
指向)并且如果它没有检查它是否存在则可能会崩溃复制到自身,因为它会在复制之前删除它的存储空间。
此功能也可以先复制存储 ,然后将pmessage
更改为指向副本,然后删除旧版本,这样可以避免需要检查复制到自己,但在这种情况下也会导致不必要的副本。