可能重复:
Difference between pointer variable and reference variable in C++
我什么时候应该将变量声明为指针vs传递引用的对象?他们在汇编中编译成相同的东西(至少是渐近运行时),那么什么时候应该使用哪个呢?
void foo(obj* param)
void foo(obj& param)
答案 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_1
是int
(或float
),而somevar_2
是某种指针。