c ++ * vs&在函数声明中

时间:2009-07-04 08:44:16

标签: c++ pointers reference pass-by-reference

  

可能重复:
  Difference between pointer variable and reference variable in C++

我什么时候应该将变量声明为指针vs传递引用的对象?他们在汇编中编译成相同的东西(至少是渐近运行时),那么什么时候应该使用哪个呢?

void foo(obj* param)
void foo(obj& param)

5 个答案:

答案 0 :(得分:13)

我的规则很简单:当你想要显示该值是可选的时使用*,因此可以是0.

从规则中排除:所有_obj_s都存储在容器中,并且您不希望使用foo(*value);而不是foo(value);来使代码看起来很难看 那么为了表明该值不能为assert(value);放在函数begin。

答案 1 :(得分:6)

我跟随Google style guide standard,因为它对我来说最有意义。它声明:

  

在函数参数列表中全部   引用必须是const:

void Foo(const string &in, string *out);
     

事实上,这是一个非常强大的惯例   在输入参数的Google代码中   是值或const引用   输出参数是指针。输入   参数可以是常量指针,但是   我们从不允许非const引用   参数。

     

您可能需要输入的一种情况   参数是一个const指针是if   你想强调一下   参数不被复制,所以它必须   存在于对象的生命周期;   通常最好记录下来   评论也是。 STL适配器如   bind2nd和mem_fun不允许   参考参数,所以你必须   用指针声明函数   这些情况下的参数也是如此。

答案 2 :(得分:3)

使用指针的一个原因是将NULL值传递给函数是否有意义。使用指针,预计能够做到这一点。有了参考,预计不会这样做。

(但是,通过做一些棘手的事情,仍然可以将NULL传递给引用参数。在这种情况下,您可以预期被调用的函数可能会崩溃。)

另一个约定是,如果将指针传递给函数,该函数可以使用指针获取对象的所有权(特别是在类似COM的引用计数环境中)。如果传递引用,则被调用函数可以期望在函数调用期间使用该对象,但不能保留指向该对象的指针以供以后使用。

答案 3 :(得分:2)

指针和引用之间的另一个区别在于暗示您不会保留引用,除非您将其传递给构造函数。传递指针可能意味着对象可能会暂时保留它,就像复合模式对象一样。

答案 4 :(得分:0)

我在C ++应用程序中使用指针而不是引用的一个很好的理由是可读性。使用指针时,您会看到实际发生的事情,并且在使用指针时,语法会告诉您实际发生了什么。

“0”或“NULL”也是如此。我更喜欢使用“NULL”,这种方式在3个月后,当我看到一个代码如下:

somevar_1 = 0;
somevar_2 = NULL;

我知道somevar_1int(或float),而somevar_2是某种指针。