![]() |
1
22
在以下情况下,我更喜欢引用而不是指针:
有人说引用和常量引用之间的区别对很多人来说太细微了,在调用方法的代码中是看不见的(例如,如果您读取通过引用传递参数的调用代码,您就看不到它是常量引用还是非常量引用),因此您应该将其作为POINter(为了在调用代码中明确表示您要给出变量的地址,因此被调用方可能会更改变量的值)。 我个人更喜欢推荐信,原因如下:
[1]意味着让调用者看到可变性并不重要,因为调用者应该已经(通过其他方式)理解子例程的作用(包括它将修改参数的事实)。 [2]意味着如果它是指针,那么子例程应该处理参数为空指针的可能性,这可能是额外的和IMO无用的代码。 此外,每当我看到一个指针,我就会想,“谁会删除这个,什么时候删除?”因此,无论何时/何地,所有权/生存期/删除都不是一个问题,我更喜欢使用引用。 对于值得一提的是,我习惯于编写常量正确的代码:因此,如果我声明一个方法有一个非常量引用参数,那么它是非常量这一事实就非常重要。如果人们没有编写正确的常量代码,那么可能很难判断是否会在子例程中修改参数,而另一种机制(例如指针而不是引用)的参数会更强一些。 |
![]() |
2
5
参考传递的优点:
按值传递指针的优点:
因为引用传递使用的是语言,所以任何非指针参数也可能会被修改,而您不会 知道 指针值正在更改。我见过API,它们被视为常量。所以指针传递并不能真正给读者提供任何他们可以信赖的信息。对某些人来说,这也许足够好,但对我来说,却不够好。 实际上,指针传递只是C留下的一个容易出错的杂乱的hack,它没有其他方法通过引用传递值。C++有一种方式,所以黑客不再需要了。 |
![]() |
3
4
通过引用传递的一个优点是,它们不能为空(与指针不同),从而避免了对每个out参数进行空签出的需要。 |
![]() |
4
3
我建议你 考虑 (可能不是对每种情况都最好)从函数返回foo,而不是修改参数。您的函数原型如下所示:
当您似乎返回成功/失败标志时,使用异常可能是更好的策略。 优势:
|
![]() |
5
1
我选择2是因为在调用点很明显参数将被更改。 getfoo(&var)而不是getfoo(var) 对于常量引用,我更喜欢传递引用,在这里我试图避免复制构造函数调用。 |
![]() |
6
1
通过引用传递,并避免整个空指针问题。 |
![]() |
7
0
我似乎记得,在C++引用中,NULL和指针可能是空的。现在我已经很久没有做C++了,所以我的记忆力会生锈。 |
![]() |
8
0
这里的差别相对较小。 引用不能为空。 可以传递空指针。 因此,您可以检查是否发生了这种情况并做出相应的反应。 我个人无法想到这两种可能性中的一种真正的优势。 |
![]() |
9
0
我觉得这是个人品味的问题。实际上,我更喜欢引用传递,因为指针提供了更多的自由度,但它们也会导致很多问题。 |
![]() |
10
0
指针的好处在于,您不能传递任何内容,即,将其用作参数完全是可选的,并且没有调用方传递的变量。 否则,如果您有一个引用,它保证存在并且是可写的(当然,除非是常量),则引用更安全。 我认为这是一个优先事项,否则,但我不喜欢将两者混合,因为我认为这会使代码的维护和可读性变得更难(特别是当您的两个函数在调用方看来相同时) |
![]() |
11
0
现在我使用常量引用作为输入参数,使用指针作为输出参数。FWIIW Google C++ Style Guide recommends the same approach (我并不总是同意他们的风格指南-例如他们不使用例外,这通常没有什么意义) |
![]() |
12
0
我的偏好是推荐信。首先,因为它押韵。:)也因为其他答案指出的问题:不需要取消引用,引用也不可能为空。另一个我没有提到的原因是,当您看到一个指针时,您不能确定它是否指向动态分配的内存,您可能会试图调用
尽管如此,在许多情况下,传递指针更可取,甚至是必要的。如果预先知道参数是可选的,那么允许它为空非常有用。类似地,您可能提前知道参数总是动态分配的,并且内存管理都已完成。 |
![]() |
Kris · 有没有办法获得可变结构字段的“引用” 3 年前 |
![]() |
Jora Karyan · IF语句未按预期引发错误 3 年前 |
![]() |
nedzad · 如何访问引用Firebase中其他对象的对象 7 年前 |
![]() |
Empha · 从成员函数对对象所做的更改不会持续。范围/参考问题? 7 年前 |