Операция копии изменяет элемент данных исходного объекта
Этот дефект происходит, когда конструктор копии или оператор присваивания копии изменяют изменяемый элемент данных его исходного операнда.
Например, этот конструктор копии A
изменяет элемент данных m
из его исходного операнда other
:
class A { mutable int m; public: ... A(const A &other) : m(other.m) { other.m = 0; //Modification of source } }
Операция копии с конструктором копии (или оператор присваивания копии):
className new_object = old_object; //Calls copy constructor of className
old_object
к его целевому операнду new_object
. После операции вы ожидаете, что целевой операнд будет копией немодифицированного исходного операнда. Если исходный операнд изменяется во время копии, это предположение нарушено.Не изменяйте исходный операнд в операции копии.
Если вы изменяете исходный операнд в конструкторе копии, чтобы реализовать операцию пересылки, используйте конструктора перемещения вместо этого. Переместитесь конструкторы заданы на C++ 11 стандартов и позже.
Группа: объектно-ориентированный |
Язык: C++ |
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода |
Синтаксис командной строки:
COPY_MODIFYING_SOURCE |
Удар: Средняя |