如果我不修改它,我不应该通过引用传递指针吗?

时间:2017-02-21 00:01:34

标签: c++

在下面的代码中,我不应该通过引用传递newNode,因为我没有修改它吗?

void IntBinaryTree::insert(TreeNode *&nodePtr, TreeNode *&newNode)
{
    if (nodePtr == 0)
        nodePtr = newNode;
    else if (newNode->value < nodePtr->value)
        insert(nodePtr->left, newNode);
    else
        insert(nodePtr->right, newNode);
}

2 个答案:

答案 0 :(得分:4)

通过引用传递指针引入了额外的间接级别。

基本上它对应于将指针传递给指针,尽管编译器可以选择优化它。

因此它可以在堆栈空间或寄存器使用中产生成本,另外还有解除引用的时间,与按值传递指针的基本成本相同。

如果您不修改指针,则没有理由可能产生这笔费用。

在较高级别,该引用向读者表明指针可能会被修改,而不是。

这就是那个人。

所以答案是“不”,无论是出于性能原因还是为了清楚起见,当保证不修改时,最好不要通过引用传递newNode指针。

给定代码

void IntBinaryTree::insert(TreeNode *&nodePtr, TreeNode *&newNode)
{
    if (nodePtr == 0)
        nodePtr = newNode;
    else if (newNode->value < nodePtr->value)
        insert(nodePtr->left, newNode);
    else
        insert(nodePtr->right, newNode);
}

......可以更好地表达为

void IntBinaryTree::insert(TreeNode*& nodePtr, TreeNode* const newNode)
{
    if (nodePtr == nullptr)
        nodePtr = newNode;
    else if (newNode->value < nodePtr->value)
        insert(nodePtr->left, newNode);
    else
        insert(nodePtr->right, newNode);
}

const向读者传达指针值在整个函数体中保持不变。

我认为if - else即使严格应用“不要重复自己”原则指示条件表达式也是正常的。这是因为此处的if - else结构有助于降低代码的本地复杂性。使用纯粹的表达式看起来会更复杂。

答案 1 :(得分:0)

我认为将它作为const指针传递是理想的,因为它有助于表明它没有被修改。