使用引用地址的C ++运算符重载

时间:2014-04-22 14:29:41

标签: c++

// 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是一个参考地址?

3 个答案:

答案 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,

因为&aMessaMess的地址。根据定义,具有相同地址的指针指向同一对象。

  

为什么不使用if(this == aMess)?

将指针(this)与引用(aMess)进行比较,除非CMessage::operator CMessage* ()存在,否则不会编译(希望它不会)。如果想要比较对象的,他们会写if(*this == aMess),如果存在则调用bool CMessage::operator ==(const CMessage&),或者如果不存在则对对象进行二进制比较。

  

& aMess是一个参考地址吗?

它是对象的地址。将一元&应用于引用与将其应用于引用对象的方法相同。


本练习的重点是CMessage类中有堆分配的存储空间(由pmessage指向)并且如果它没有检查它是否存在则可能会崩溃复制到自身,因为它会在复制之前删除它的存储空间。

此功能也可以先复制存储 ,然后将pmessage更改为指向副本,然后删除旧版本,这样可以避免需要检查复制到自己,但在这种情况下也会导致不必要的副本。