【问题标题】:How to check if two addresses are the same?如何检查两个地址是否相同?
【发布时间】:2016-12-13 22:00:03
【问题描述】:

如果给定一个函数operator=,我如何检查两个内存地址是否相同?我相信以下是正确的,但它使用 == 运算符而不是定义的运算符。我将如何使用 = 运算符来做到这一点?

if(&this == &rhs)
    return true;

【问题讨论】:

  • operator= 是 赋值 运算符,而不是比较。
  • if(&this == &rhs) 您可能想使用if(this == &rhs),但您的问题范围太窄了。
  • “我将如何使用 = 运算符来做到这一点?” 嗯?你想达到什么目的?
  • operator= 的一个常见实现是在分配成员之前测试对象是否相等。这通常由if (this != &other) 执行。

标签: c++ operators memory-address


【解决方案1】:

您没有比较正确的地址。 this 已经是指向您的对象的指针。看来您正在尝试实现通用模式:

Foo & Foo::operator=( const Foo & rhs )
{
    if( this == &rhs )
    {
        // :::
    }

    // :::
}

上面,this 的类型是Foo*,&rhs 是Foo const *,使它们具有可比性。


[编辑:从标准中添加相关部分,取自 C++14 草案标准]

从第 5.3.1 节 [expr.unary.op] :

  1. 一元 & 运算符的结果是指向其操作数的指针。操作数应为左值或qualified-id。 ...

从第 9.3.2 节 [class.this] :

  1. 在非静态成员函数的主体中,关键字 this 是一个纯右值表达式,其值是调用该函数的对象的地址。

由于this 既不是左值也不是qualified-id,因此您无法获取其地址,如果您尝试,编译器应该会报告错误。

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 2016-09-24
    • 2023-03-13
    • 2011-06-22
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多