gpt4 book ai didi

c++ - 这个拷贝构造函数有什么问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:36 26 4
gpt4 key购买 nike

我一直在努力想出一个树的复制构造函数。我发现了很多建议。

这个让我很感兴趣。

class TreeNode
{
int ascii;
TreeNode* left;
TreeNode* right;

public:
TreeNode() { ascii = 0; left = right = 0; }
TreeNode* clone();
// ...
};

TreeNode* TreeNode::clone()
{
if (TreeNode* tmp = new TreeNode)
{
tmp->ascii = ascii;
if (left) tmp->left = left->clone();
if (right) tmp->right = right->clone();
return tmp;
}
return 0;
}

if (TreeNode* tmp = new TreeNode) 是什么意思?

除此之外,它看起来还不错。只是效果不是很好。

知道它有什么问题吗?

上面的例子来自this网站。

最佳答案

好吧,对于初学者来说,它不是复制构造函数 - 复制构造函数在 C++ 中具有定义非常明确的语法,因此适当的复制构造函数应该具有原型(prototype) TreeNode(TreeNode const &)。只是为了正确使用术语(编译器仍然会生成一个复制构造函数,因为它不知道 clone() 函数应该做什么)。

if 语句中的表达式将分配一个新的 TreeNode 对象并声称检查分配是否成功(通过检查结果指针不为 0)。不幸的是,标准之前的 C++ 和符合标准的现代 C++ 实现将抛出 std::bad_alloc 异常,因此测试主要会给用户一种温暖的模糊感觉,即正在对内存进行处理分配失败,即使不是。

为了使代码在符合标准的编译器上按预期工作,您必须使用 nothrow new。从内存中看,这行内容是这样的:

if (TreeNode* tmp = new(std::nothrow) TreeNode)

总而言之,除非 TreeNode 是依赖于 clone() 函数存在的对象层次结构的一部分,否则我将取消它并实现一个适当的 C++ 构造函数。这样一来,编译器和您在复制对象时处于同一页面上,而且其他程序员会发现更容易理解您的代码。

关于c++ - 这个拷贝构造函数有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3420297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com