【问题标题】:Is the object "this" points to the same as a const object?对象“this”是否与 const 对象指向相同?
【发布时间】:2020-04-14 09:28:31
【问题描述】:

这个问题与 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 constants const-correctness this-pointer


    【解决方案1】:

    在非静态成员函数的主体内,表达式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)
    

    即返回对非常量的引用……

    【讨论】:

      【解决方案2】:

      来自implicit_conversion

      • 指向 cv 限定类型 T 的类型指针的纯右值可以转换为指向更多 cv 限定的相同类型 T 的纯右值指针(换句话说,可以添加 constness 和易失性)。

      【讨论】:

      • 该引用仅适用于 指针。 OP 将非const 左值绑定到const 左值引用,这不是限定转换。请参阅上面的其他答案。
      • 同意,这是引用初始化。
      猜你喜欢
      • 2010-09-18
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2013-03-08
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多