将向量传递给函数时,应使用哪种方法:引用还是指针?
我看到在很多情况下,两者中的任何一个都能胜任。 即使在这些情况下,两种方法的执行方式是否也存在差异?
我看不出是否只有两种情况之一可以工作。 有这种情况吗?
编辑:引用(关于一般差异指针与引用的问题)包含此操作规范的答案非常相关,但我怀疑这是一个骗子。 指针和引用之间的差异(就传递给函数而言)可以肯定地从那里的答案中推断出来,但它们可能比那里的一般差异更加具体。因此,并非所有答案都与此处相关。此外,这里的一些答案可能仅部分相关。
答案 0 :(得分:1)
这主要是首选项。我遵循以下规则:在可以时使用(const)引用,在必须时使用(const)指针。
引用隐式保证不指向null
。违反此保证会导致不确定的行为,因此请确保检查是否将指针转换为引用!我认为这是唯一的主要优势。
我看不出是否只有两种情况之一可以工作。有这种情况吗?
如果向量在堆上,而您仅持有指向它的指针,则它可能是nullptr。比您不能传递引用,因为引用不能为空。如果这样做失败,则会调用未定义的行为。
答案 1 :(得分:1)
大多数人都会同意,只要您有选择,引用将比原始指针优先。
有什么理由在这里偏爱一个或另一个吗?
指针和引用之间有一个很大的区别:引用不能为空。
如果编写带有指针的函数,则必须在某处添加nullptr检查。使用不需要的引用,并且与某些键入相同。
除此之外,指针还会引入使用引用时不会发生的错误(主要是由于指针算法),并且通常被认为不如引用安全。
我个人使用输入参数的引用,但是每当函数在参数中返回某些内容时,我都希望使用一个指针在调用站点上明确意图。
void foo(int* var) {
/*
there may be a lot of code here
*/
*var = 0;
}
// somewhere else
foo(&var);
很明显,var
可以通过foo
函数进行修改,而使用引用时却不清楚:
foo(var)
后者要求您检查函数定义以查看其是否修改了var。