对象“ this”是否指向与const对象相同?

问题描述 投票:0回答:2

此问题与在c ++中重载赋值运算符有关。看一下下面的代码。它显示了我的书给出的函数定义,以重载赋值运算符。

const cAssignmentOprOverload& cAssignmentOprOverload::operator=(
    const cAssignmentOprOverload& otherList) {
  if (this != &otherList)  // avoid self-assignment; Line 1
  {
    delete[] list;                    // Line 2
    maxSize = otherList.maxSize;      // Line 3
    length = otherList.length;        // Line 4
    list = new int[maxSize];          // Line 5
    for (int i = 0; i < length; i++)  // Line 6
      list[i] = otherList.list[i];    // Line 7
  }
  return *this;  // Line 8
}

使这一点很难理解的最大问题是,在函数的定义中,它返回*this*thisconst对象吗?我不认为是这样,为什么当返回类型应该为const时为什么允许我们返回非const对象?

c++ operator-overloading const const-correctness this-pointer
2个回答
2
投票

在非静态成员函数的主体内,表达式this可用于获取指向已在[expr.prim.this]上调用该函数的对象的指针。由于您的operator =不是const成员函数,因此this将指向非const对象(这很有意义,因为我们正在为某个对象分配新的值)。因此,*this将导致类型为cAssignmentOprOverload的非常量左值。但是,对const的引用可以绑定到非const左值[dcl.init.ref]/5.1.1。通常,const限定较少的类型始终可以隐式转换为const限定较多的类型。这很有意义:应该能够在一个不可修改的对象就足够的地方使用一个可修改的对象。通过将可修改的对象视为不可修改的对象,没有任何错误。所有发生的事情就是您丢失了该对象实际上是可修改的信息。相反,将不可修改的对象视为可修改的对象是有问题的...

注意,这种写重载operator =的方法不是how this is typically done。规范形式为

cAssignmentOprOverload& operator=(const cAssignmentOprOverload& otherList)

即返回对非常量的引用…


0
投票

来自implicit_conversion

  • 可以将指向cv限定的类型T的类型指针的prvalue转换为指向具有cv限定的相同类型T的prvalue指针(换句话说,可以添加常数和波动性。
© www.soinside.com 2019 - 2024. All rights reserved.