В дополнение к уже полученным отличным ответам я хотел бы добавить несколько перспективных деталей:
В последней версии C ++ 0x появились новые правила для автоматической генерации конструктора перемещения и оператора назначения перемещения. Хотя эта идея не является совершенно новой, последние правила находятся в черновике только с октября 2010 года и пока еще не широко доступны в компиляторах.
Если в вашем классе нет объявленного пользователем конструктора копирования, оператора назначения копирования, конструктора перемещения, оператора назначения перемещения и деструктора, компилятор предоставит вам конструктор перемещения по умолчанию и оператор назначения перемещения. Эти реализации по умолчанию просто перемещают все элементы по элементам.
Вы также можете явно задавать по умолчанию членов вашего движения:
semi_complex(semi_complex&&) = default;
semi_complex& operator=(semi_complex&&) = default;
Обратите внимание, что если вы это сделаете, вы неявно запретите семантику копирования, если вы явно не предоставите или не зададите по умолчанию конструктор копирования и оператор копирования.
В тесно связанном последнем изменении: если в вашем классе есть явный деструктор и неявные члены-копии, неявное создание этих членов теперь не рекомендуется (комитет хотел бы удалить неявное создание-копию, когда есть явный деструктор, но не может из-за обратной совместимости).
Итак, в итоге, всякий раз, когда вы объявляете деструктор, вам, вероятно, следует подумать о явном объявлении копируемых и перемещаемых членов.