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

Pet*_*art 4 c++ tree copy-constructor

我一直在尝试为树提出一个复制构造函数.我找到了不少建议.

这个让我感兴趣.

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;
    }
Run Code Online (Sandbox Code Playgroud)

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

除此之外它看起来还不错.它只是不能很好地工作.

知道它有什么问题吗?

上面的例子来自这个网站.

Tim*_*sch 10

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

if语句中的表达式将分配一个新的TreeNode对象并声称检查分配是否成功(通过检查结果指针不是0).不幸的是,标准符合的预标准C++和现代C++实现将引发std::bad_alloc异常,因此测试将主要给用户一种温暖的模糊感觉,即即使不是,也会对内存分配失败做些什么.

为了使代码在符合标准的编译器上按预期工作,您必须使用nothrow new.从内存中,该行将读取如下内容:

if (TreeNode* tmp = new(std::nothrow) TreeNode)
Run Code Online (Sandbox Code Playgroud)

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