Является ли объект «this» тем же, что и объект const? - PullRequest
0 голосов
/ 23 декабря 2019

Этот вопрос связан с перегрузкой оператора присваивания в 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,Является ли *this const объектом? Я не думаю, что это так, почему мы можем возвращать не const объект, когда тип возвращаемого значения должен быть const?

Ответы [ 2 ]

2 голосов
/ 23 декабря 2019

Внутри тела нестатической функции-члена выражение this может использоваться для получения указателя на объект, для которого была вызвана функция [expr.prim.this] . Поскольку ваш operator = не является константной функцией-членом, this будет указывать на неконстантный объект (что имеет смысл, поскольку мы назначаем новое значение чему-либо). Таким образом, *this приведет к неконстантному lvalue типа cAssignmentOprOverload. Однако ссылка на const может быть привязана к неконстантному lvalue [dcl.init.ref] /5.1.1. В общем случае менее константный квалифицированный тип всегда может быть неявно преобразован в более константный. Что имеет смысл: вы должны иметь возможность использовать модифицируемый объект в местах, где немодифицируемого достаточно. Ничто действительно не может пойти не так, рассматривая модифицируемый объект как немодифицируемый. Все, что происходит, это то, что вы теряете информацию о том, что этот объект действительно был изменяем. Напротив, трактовать неизменяемый объект как модифицируемый, проблематично…

Обратите внимание, что этот способ записи перегруженного operator = не , как это обычно делается . Каноническая форма будет

cAssignmentOprOverload& operator=(const cAssignmentOprOverload& otherList)

, т. Е. Возвращать ссылку на неконстантную…

0 голосов
/ 23 декабря 2019

С implicit_conversion

  • Значение указателя типа для c-квалифицированного типа T может быть преобразовано в указатель prvalue для более квалифицированного cv того же типа T (в другихслова, постоянство и волатильность могут быть добавлены).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...