C++ 复制构造函数中的指针

C++ 复制构造函数中的指针,c++,pointers,C++,Pointers,我有一个复制构造函数,看起来像这样: Qtreenode(const QtreeNode * & n) { x=n->x; y=n->y; height=n->height; width=n->width; element=n->element; } 我在一周前写了这篇文章,今天回顾这篇文章时,我惊讶地发现当用sayswChild=newqtreenode(*(n->swChild))调用复制构造函数时指向cc的参

我有一个复制构造函数,看起来像这样:

Qtreenode(const QtreeNode * & n) {

    x=n->x;
    y=n->y;
    height=n->height;
    width=n->width;
    element=n->element;
}


我在一周前写了这篇文章,今天回顾这篇文章时,我惊讶地发现当用say
swChild=newqtreenode(*(n->swChild))调用复制构造函数时指向cc的参数是引用指针,对吗?但当我称之为(*(n->swChild)),这意味着孩子权利的价值?为什么我的代码可以工作?

这不是复制构造函数。类的复制构造函数是引用该类类型的构造函数。以下任何一个都是复制构造函数,尽管第二个是const引用,是目前最常用的:

QTreeNode(QTreeNode&);
QTreeNode(const QTreeNode&);
QTreeNode(volatile QTreeNode&);
QTreeNode(const volatile QTreeNode&);

由于这不是复制构造函数,因此仍然提供隐式声明的复制构造函数。它被声明为
QTreeNode(constqtreenode&n)
,基本上只复制类的每个成员(即,它是“浅”副本,而不是“深”副本)。代码中使用的是这个隐式声明的复制构造函数。

它不是复制构造函数,只是一个常规的旧构造函数。复制构造函数将采用
常量QtreeNode&
,而不是
常量QtreeNode*&


由于您没有定义复制构造函数,编译器为您创建了一个。这是在
swChild=newqtreenode(*(n->swChild))行中调用的
,因为您传递的是
QtreeNode
,而不是指向该节点的指针。

这是什么意思?我遗漏了什么可以让它成为复制构造函数?还是不明白。现在这不是一个复制构造函数,但它确实会生成浅层复制?不过我想做深度复制。那么,我是否要删除参数中的指针?还有什么需要改变?@bitmoe:你没有错过。您有一个字符超出了需要:
*
@bitmoe:What@ybungalobill说:您的复制构造函数不能接受指针,它必须接受引用。您需要删除
*
(将参数设置为对
QTreeNode
的引用,而不是对指向
QTreeNode
的指针的引用),并相应地更新其余代码。我的函数是稍等片刻,因为它已被修复为复制构造函数,递归以复制给定节点的整个子树?因为我从operator=重载调用copy构造函数来复制源的根节点,就像这样
root=newqtreenode(*(source.root))
,我希望它通过递归复制根的整个子树。我是用我的函数来完成的吗?你是用一个智能指针作为四个子指针吗?如果不是,则该类不是异常安全的:如果任何分配或创建引发异常,您将泄漏
QtreeNode
对象。我想这可能就是问题所在。