在下面的代码中,我不应该通过引用传递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);
}
答案 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指针传递是理想的,因为它有助于表明它没有被修改。