关于指针:c++函数声明*和&的区别

c++ * vs & in function declaration

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Difference between pointer variable and reference variable in C++

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

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


我的规则很简单:当您想显示值是可选的,因此可以是0时,请使用*。

排除在规则之外:所有的对象都存储在容器中,你不想让你的代码看起来很难看,因为在任何地方都使用foo(*value);,而不是foo(value);。因此,为了证明该值不能为0,请将assert(value);放在函数开始处。


我遵循谷歌风格指南标准,因为它对我来说最有意义。它指出:

Within function parameter lists all
references must be const:

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

In fact it is a very strong convention
in Google code that input arguments
are values or const references while
output arguments are pointers. Input
parameters may be const pointers, but
we never allow non-const reference
parameters.

One case when you might want an input
parameter to be a const pointer is if
you want to emphasize that the
argument is not copied, so it must
exist for the lifetime of the object;
it is usually best to document this in
comments as well. STL adapters such as
bind2nd and mem_fun do not permit
reference parameters, so you must
declare functions with pointer
parameters in these cases, too.


使用指针的一个原因是,如果向函数传递NULL值是有意义的话。有了指针,它就可以做到这一点。有了一个引用,就不期望它能够做到这一点。

(但是,通过执行复杂的操作,仍然可以将空值传递到引用参数中。在这种情况下,调用的函数可能会崩溃。)

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


指针和引用之间的另一个区别是,这意味着除非将一个引用传递给构造函数,否则您将无法保留该引用。传递指针可能意味着一个对象可能会保持一段时间,就像复合模式对象一样。


我在C++应用中使用指针而不是引用的一个很好的原因是可读性。当使用指针时,您会看到实际发生的事情,当使用指针时,语法会告诉您实际发生的事情。

"0"或"空"也一样。我更喜欢使用"空",3个月后,当我看到如下代码时:

1
2
somevar_1 = 0;
somevar_2 = NULL;

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