对象“ this”指向的对象与const对象相同吗?

时间:2019-12-23 01:57:21

标签: c++ operator-overloading const const-correctness this-pointer

这个问题与在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对象呢?

2 个答案:

答案 0 :(得分: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)

即返回对非常量的引用…

答案 1 :(得分:0)

来自implicit_conversion

  • 可以将指向cv限定的类型T的类型指针的prvalue转换为指向具有cv限定的相同类型T的prvalue指针(换句话说,可以添加常数和波动性)。