Ну, во-первых, это не конструктор копирования - конструкторы копирования имеют очень хорошо определенный синтаксис в C ++, поэтому правильный конструктор копирования будет иметь прототип TreeNode(TreeNode const &)
.Просто чтобы получить правильную терминологию (и компилятор все равно сгенерирует конструктор копирования, так как он не знает, что должна делать функция clone()
).
Выражение в операторе if выделит новыйОбъект TreeNode и имеет целью проверить, что выделение прошло успешно (путем проверки, что результирующий указатель не равен 0).К сожалению, это предстандартные C ++ и современные реализации C ++, которые соответствуют стандарту, вместо этого выдает исключение std::bad_alloc
, поэтому тест в основном даст пользователю теплое нечеткое ощущение, что что-то делается с ошибкой выделения памяти, даже если это не так.t.
Чтобы код работал должным образом на стандартном компиляторе, вам придется использовать nothrow new.Из памяти строка будет читать что-то вроде этого:
if (TreeNode* tmp = new(std::nothrow) TreeNode)
Все это говорит, если только TreeNode не является частью иерархии объектов, которая опирается на наличие функции clone()
, которую я бы покончил с этим и реализовалвместо этого правильный конструктор C ++.Таким образом, компилятор и вы находитесь на одной странице, когда дело доходит до дублирования объектов, плюс другим программистам будет немного легче следовать вашему коду.