假设您有一个修改变量的函数.
你应该这样写:void myfunc(int *a)
或者像这样void myfunc(int &a)
?
前者强制你调用函数,myfunc(&b)
因此调用者知道b
将被修改,但后者更短,可以简单地调用myfunc(b)
.那么哪个更好用?还有什么我想念的吗?
在传递"NULL"有意义的地方应该使用指针(即'*').例如,您可以使用NULL来表示需要创建特定对象,或者不需要执行特定操作.或者是否需要从非C++代码调用它.(例如,用于共享库)
例如.libc函数time_t time (time_t *result);
如果result
不为NULL,则将存储当前时间.但如果result
为NULL,则不执行任何操作.
如果您正在编写的函数不需要使用NULL作为有意义的值,那么使用引用(即'&')可能会减少混淆 - 假设这是您的项目使用的约定.
我尽可能使用引用而不是指针.这样做的原因是,搞砸引用比指针更难.人们总是可以将NULL传递给指针值,但是没有这样的等价于引用.
唯一真正的缺点是C++中的参考参数缺少调用站点文档.有些人认为这使得理解代码变得更加困难(我同意一定程度).我通常在我的代码中定义以下内容并将其用于虚假的呼叫站点文档
#define byref ... someFunc(byref x);
这当然不会强制执行呼叫站点文档.它只是提供了一种记录它的非常蹩脚的方式.我做了一些实验,模板强制执行呼叫站点文档.尽管如此,这比实际生产代码更有趣.
http://blogs.msdn.com/jaredpar/archive/2008/04/03/reference-values-in-c.aspx
我想我会不同意@bb和@JaredPar,我倾向于围栏的另一面.经过多年努力支持其他人的C++代码,我经常发现潜在的参考参数的非明显副作用的问题.使用C#,很明显,因为你必须使用'ref'/'out'为参数类型添加前缀,但引用在C++中可能会引起混淆.所以,我喜欢指针,因为很明显有些东西会重新出现.如果你不喜欢积分,C++不适合你.
由于这里和其他地方引用的原因,我来到围栏的指针一侧.但是,我会说,无论你决定什么,你都需要保持一致,并在你的风格指南中记录它.
Google C++样式指南禁止非const引用参数.