【问题标题】:Why do we use the reference operator twice?为什么我们要使用两次引用运算符?
【发布时间】:2013-03-16 22:41:01
【问题描述】:

我的问题是指带有类的指针和关键字 this。

class class1 {
public:
    bool isitme(class1& temp){
        if(this == &temp)
            return true;
        else return false;
    }
};


int main () {
    class1 c3;
    class1* c2 = &c3;
    if(c3.isitme(*c2))
        cout << "c3 == c2"; //it is returning that
    system("pause");
}

上面的代码可以工作,但我不明白为什么它只在bool isitme(class1&amp; temp)if(this == &amp;temp) 在同一个函数isitme() 中时才有效。

我的意思是,我们已经在类参数中读取了 temp 的内存块 class1&amp; temp,并且应该能够将该内存块与关键字 this 进行比较。为什么这个函数只有在我双重获取引用 (this == &amp;temp) 时才为真?

谢谢

【问题讨论】:

    标签: c++ class pointers reference


    【解决方案1】:

    this 是一个指针,而temp 是一个引用。当您在if 语句中写&amp;temp 时,您使用的是temp 的地址。这会将其转换为可以与this 进行比较的指针。

    【讨论】:

    • 那么,如果一个引用的引用,它会被转换成一个指针?
    • @Rov 你没有参考参考。您正在获取通过引用传递的对象的地址。 temp 不是引用,temp 是一个对象,通过引用传递。
    • 哦,我明白了,谢谢。最后一个问题,为什么要通过引用传递?
    • @Rov:如果你按值传递它,函数会得到一个副本,并且无法有意义地比较地址。
    • 谢谢 NPE 和@Tolga :)
    【解决方案2】:

    不要将引用声明与地址操作符的使用混淆。当 & identifier 前面有一个类型(例如 int 或 char)时,则 identifier 被声明为对该类型的引用。当 & 标识符前面没有类型时,用法是地址运算符的用法。

    取自:http://msdn.microsoft.com/en-us/library/w7049scy(v=vs.71).aspx

    【讨论】:

      【解决方案3】:

      自 c/c++ 时代以来已经有一段时间了,但让我试一试...

      您没有使用两次引用运算符。当你指定class1&amp; 时,你只是指定了参数的类型(类型是“class1 类型的引用”),实际上并没有对temp 做任何事情。稍后您实际上使用&amp;temp 取消引用该参数。只有 & 符号的第二次出现实际上是一个引用运算符。

      【讨论】:

        【解决方案4】:

        方法声明中的&amp; 运算符仅仅意味着传递的对象不应被复制,而是指向与传递给它的对象相同的位置(它是一个引用)。需要 if(this == &amp;temp) 中的 &amp; 运算符来实际获取该对象的地址(指针),以便您可以将其与 this 指针进行比较。

        【讨论】:

          【解决方案5】:

          isitme 方法签名中的引用“操作符”表示引用,即对象本身的别名。

          另一方面,在if(this == &amp;temp) 行中,运算符直接用于对象,因此返回对象的地址(指向它的指针)。

          因此,如果要检查输入的引用是否等于this,则需要与指针进行比较,这正是引用运算符返回的内容。

          【讨论】:

            【解决方案6】:

            类参数列表中的&amp; 表示对象是通过引用传递的。也就是说,tempclass1 对象的别名。 &amp;temp 只是获取该对象的地址并将其与this 指向的对象进行比较。这两种语法在语义上是不同的,您不会两次获取地址。

            【讨论】:

              猜你喜欢
              • 2016-09-22
              • 2021-05-16
              • 1970-01-01
              • 1970-01-01
              • 2015-04-03
              • 2018-09-14
              • 1970-01-01
              • 1970-01-01
              • 2011-02-15
              相关资源
              最近更新 更多