可能重复:
C++ 中指针变量和引用变量之间的区别
我什么时候应该将我的变量声明为指针与通过引用传递的对象?它们在汇编中编译成相同的东西(至少在运行时渐近)所以我什么时候应该使用哪个?
void foo(obj* param)
void foo(obj& param)
可能重复:
C++ 中指针变量和引用变量之间的区别
我什么时候应该将我的变量声明为指针与通过引用传递的对象?它们在汇编中编译成相同的东西(至少在运行时渐近)所以我什么时候应该使用哪个?
void foo(obj* param)
void foo(obj& param)
我的规则很简单:当你想显示该值是可选的,因此可以为 0 时使用 *。
从规则中排除:周围的所有 _obj_s 都存储在容器中,您不希望通过使用无处不在foo(*value);
而不是So then 来显示在函数开始处foo(value);
放置的值不能为 0,从而使您的代码看起来很难看。assert(value);
我遵循谷歌风格指南标准,因为它对我来说最有意义。它指出:
在函数参数列表中,所有引用都必须是 const:
void Foo(const string &in, string *out);
事实上,在 Google 代码中,输入参数是值或 const 引用,而输出参数是指针,这是一个非常严格的约定。输入参数可能是 const 指针,但我们绝不允许非 const 引用参数。
您可能希望输入参数为 const 指针的一种情况是,如果您想强调该参数没有被复制,因此它必须在对象的生命周期内存在;通常最好在评论中记录这一点。STL 适配器(如 bind2nd 和 mem_fun)不允许引用参数,因此在这些情况下您也必须使用指针参数声明函数。
NULL
使用指针的一个原因是向函数传递值是否有意义。有了指针,它有望做到这一点。有了参考,预计无法做到这一点。
(但是,通过做一些棘手的事情,仍然可以将 NULL 传递给引用参数。您可以预期在这种情况下被调用的函数可能会崩溃。)
另一个约定是,如果将指针传递给函数,函数可能会使用指针来获取对象的所有权(尤其是在类似 COM 的引用计数环境中)。如果您传递一个引用,那么被调用的函数可以期望在函数调用期间使用该对象,但不会保留指向该对象的指针以供以后使用。
指针和引用之间的另一个区别是,它暗示您不会保留引用,除非您将一个引用传递给构造函数。传递指针可能意味着一个对象可能会持有它一段时间,就像一个复合模式对象。
我在 C++ 应用程序中使用指针而不是引用的一个很好的理由是可读性。使用指针时,您会看到真正发生的事情,而使用指针时,语法会告诉您真正发生的事情。
“0”或“NULL”也是如此。我更喜欢使用“NULL”,这样 3 个月后,当我看到如下代码时:
somevar_1 = 0;
somevar_2 = NULL;
我知道这somevar_1
是一个int
(or float
) 并且somevar_2
是某种指针。