operator=
метод не возвращает указатель на текущий объект
Этот дефект возникает, когда операторы назначения, такие как operator=
и operator+=
не возвращать ссылку на *this
, где this
- указатель на текущий объект. Если на operator=
метод не возвращается *this
, это означает, что a=b
или a.operator=(b)
не возвращает цессионария a
после назначения.
Для образца:
Оператор возвращает свой параметр вместо ссылки на текущий объект.
То есть у оператора есть форма MyClass & operator=(const MyClass & rhs) { ... return rhs; }
вместо MyClass & operator=(const MyClass & rhs) { ... return *this; }
.
Оператор возвращается по значению, а не по ссылке.
То есть у оператора есть форма MyClass operator=(const MyClass & rhs) { ... return *this; }
вместо MyClass & operator=(const MyClass & rhs) { ... return *this; }
.
Пользователи обычно ожидают, что назначения объектов будут вести себя как назначения между встроенными типами, и ожидают, что назначение вернет исполнителя. Например, правое ассоциативное присвоение цепи a=b=c
требует, чтобы b=c
вернуть правопреемника b
после назначения. Если оператор назначения ведет себя по-разному, пользователи вашего класса могут столкнуться с неожиданными последствиями.
Неожиданные последствия возникают, когда назначение является частью другого оператора. Для образца:
Если на operator=
возвращает свой параметр вместо ссылки на текущий объект - a=b назначения
возвращает b
вместо a
. Если на operator=
выполняет частичное назначение представителей данных после назначения a=b
, данные представители a
и b
разные. Если вы или другой пользователь вашего класса читаете представителей данных возвратов значения и ожидаете представителей данных a
, у вас могут быть неожиданные результаты. Например, см. «Возвращаемое значение оператора = То же, что аргумент».
Если на operator=
метод возвращает *this
по значению, а не по ссылке, копия *this
возвращается. Если вы ожидаете изменить результат назначения с помощью оператора, такого как (a=b).modifyValue()
, вы изменяете копию a
вместо a
сам.
Возврат *this
от ваших операторов назначения.
Группа: Объектно-ориентированная |
Язык: C++ |
По умолчанию: Off |
Синтаксис командной строки: RETURN_NOT_REF_TO_THIS |
Влияние: Низкое |