【问题标题】:Why does 'this' need to be dereferenced in this case? (assignment operator)为什么在这种情况下需要取消引用“this”? (赋值运算符)
【发布时间】:2019-12-04 18:33:18
【问题描述】:

所以这是一个用户定义向量类的复制分配示例 [摘自 Bjarne Stroustrup 的“C++ 之旅(第 2 版)”:

Vector& Vector::operator=(const Vector& a) // copy assignment
{
    double* p = new double[a.sz];
    for (int i=0; i!=a.sz; ++i)
        p[i] = a.elem[i];
    delete[] elem; // delete old elements
    elem = p; // here elem is the vector's data holding member array
    sz = a.sz;
    return *this;
}

'This' 是一个指针,所以解引用它实际上应该给我们它指向的当前对象。在预期对所述对象的引用时,如何将对象作为返回值接受?

【问题讨论】:

    标签: c++ class operator-overloading this assignment-operator


    【解决方案1】:

    this 是指向所分配对象的指针。该函数返回对对象的引用。所以需要解引用指针来获取对象的左值。

    【讨论】:

    • 那么当函数的返回类型为X&时,函数的return语句只需要提供一个X类型的对象吗?
    • @tudorarion C++ 中没有语法工具,意思是“对变量 X 的引用”。转换是隐式的,没有歧义。
    • 换句话说,“是”。
    【解决方案2】:

    this 是指针类型。您的函数返回对Vector 的引用。要将指针转换为左值,您需要取消引用它。

    【讨论】:

    • 从技术上讲,取消引用不会为您提供引用类型的表达式;它为您提供了一个将 [hah!] 指向原始值的左值,并且该表达式的类型是 Vector(而不是 Vector&)。但无论如何,引用都是有趣的老东西......
    • 你改错了句子 :P 该函数返回一个Vector&,因为那是返回类型。但是您说取消引用指针会产生引用,这是不正确的。 (不过没关系)
    • 这就是我写“我认为是固定的”之类的原因。这样我确信我明白人们在告诉我什么。好吧,这次应该真的修好了。请再次检查并确保我没有再次搞砸。
    • 好吧,值类别并没有完全涵盖取消引用的作用,但足够接近。
    • 不,您需要this question 才能正确执行此操作:D。无论如何,感谢您的友好反馈。
    【解决方案3】:

    'This' 是一个指针,所以解引用它实际上应该给我们它指向的当前对象。

    是的。

    在预期对所述对象的引用时,如何将对象作为返回值接受?

    与任何其他引用的方式相同。

    int x = 3;
    int& ref = x;  // just fine
    

    为什么在这种情况下需要取消引用“this”? (赋值运算符)

    需要取消引用指针以获取指针,这与返回引用类型的函数几乎没有关系,除了说如果你没有取消引用指针,你' d 必须返回指针,因此返回类型必须是 Vector*

    【讨论】:

      猜你喜欢
      • 2011-01-16
      • 2019-10-14
      • 2018-08-01
      • 2016-08-08
      • 2012-11-02
      • 2016-07-17
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多