当前位置:  开发笔记 > 编程语言 > 正文

C++函数:&符号和星号

如何解决《C++函数:&符号和星号》经验,为你挑选了4个好方法。

假设您有一个修改变量的函数.

你应该这样写:void myfunc(int *a)或者像这样void myfunc(int &a)

前者强制你调用函数,myfunc(&b)因此调用者知道b将被修改,但后者更短,可以简单地调用myfunc(b).那么哪个更好用?还有什么我想念的吗?



1> Andrew Edgec..:

在传递"NULL"有意义的地方应该使用指针(即'*').例如,您可以使用NULL来表示需要创建特定对象,或者不需要执行特定操作.或者是否需要从非C++代码调用它.(例如,用于共享库)

例如.libc函数time_t time (time_t *result);

如果result不为NULL,则将存储当前时间.但如果result为NULL,则不执行任何操作.

如果您正在编写的函数不需要使用NULL作为有意义的值,那么使用引用(即'&')可能会减少混淆 - 假设这是您的项目使用的约定.


啊,好点.现在我觉得使用引用并不是那么糟糕.使用引用而不是指针编写函数要容易得多.谢谢 :)

2> JaredPar..:

我尽可能使用引用而不是指针.这样做的原因是,搞砸引用比指针更难.人们总是可以将NULL传递给指针值,但是没有这样的等价于引用.

唯一真正的缺点是C++中的参考参数缺少调用站点文档.有些人认为这使得理解代码变得更加困难(我同意一定程度).我通常在我的代码中定义以下内容并将其用于虚假的呼叫站点文档

#define byref
...
someFunc(byref x);

这当然不会强制执行呼叫站点文档.它只是提供了一种记录它的非常蹩脚的方式.我做了一些实验,模板强制执行呼叫站点文档.尽管如此,这比实际生产代码更有趣.

http://blogs.msdn.com/jaredpar/archive/2008/04/03/reference-values-in-c.aspx



3> kenny..:

我想我会不同意@bb和@JaredPar,我倾向于围栏的另一面.经过多年努力支持其他人的C++代码,我经常发现潜在的参考参数的非明显副作用的问题.使用C#,很明显,因为你必须使用'ref'/'out'为参数类型添加前缀,但引用在C++中可能会引起混淆.所以,我喜欢指针,因为很明显有些东西会重新出现.如果你不喜欢积分,C++不适合你.


我同意你的看法.引用的一个严重问题是`f1(int),f2(int&)`,与`f1(a),f2(a)`的调用方式相同,但存在巨大差异.调试这样的代码真的很痛苦.这是一个容易犯的错误.

4> i_am_jorf..:

由于这里和其他地方引用的原因,我来到围栏的指针一侧.但是,我会说,无论你决定什么,你都需要保持一致,并在你的风格指南中记录它.

Google C++样式指南禁止非const引用参数.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有