c ++ * vs&在函数声明中[重复]
Posted
技术标签:
【中文标题】c ++ * vs&在函数声明中[重复]【英文标题】:c++ * vs & in function declaration [duplicate] 【发布时间】:2010-11-08 02:00:44 【问题描述】:可能重复:Difference between pointer variable and reference variable in C++
我什么时候应该将我的变量声明为指针与通过引用传递的对象?它们在汇编中编译成相同的东西(至少在运行时渐近)所以我什么时候应该使用哪个?
void foo(obj* param)
void foo(obj& param)
【问题讨论】:
***.com/questions/57483/… 的骗子还有很多很多 【参考方案1】:我在 C++ 应用程序中使用指针而不是引用的一个很好的原因是可读性。使用指针时,您会看到实际发生的情况,而使用指针时,语法会告诉您实际发生的情况。
“0”或“NULL”也是如此。我更喜欢使用“NULL”,这样 3 个月后,当我看到如下代码时:
somevar_1 = 0;
somevar_2 = NULL;
我知道somevar_1
是int
(或float
),somevar_2
是某种指针。
【讨论】:
nullptr
更好! :P 不幸的是,这需要 C++11 支持:(【参考方案2】:
指针和引用之间的另一个区别是,它暗示您不会保留引用,除非您将一个引用传递给构造函数。传递指针可能意味着一个对象可能会持有它一段时间,就像一个复合模式对象。
【讨论】:
【参考方案3】:我关注Google style guide standard,因为它对我来说最有意义。它指出:
函数内参数列出所有 引用必须是 const:
void Foo(const string &in, string *out);
事实上这是一个非常强大的约定 在输入参数的谷歌代码中 是值或常量引用,而 输出参数是指针。输入 参数可能是 const 指针,但 我们从不允许非常量引用 参数。
您可能需要输入的一种情况 成为 const 指针的参数是 if 你想强调的是 参数没有被复制,所以它必须 在对象的生命周期内存在; 通常最好将其记录在 cmets 也是如此。 STL 适配器,例如 bind2nd 和 mem_fun 不允许 参考参数,所以你必须 用指针声明函数 这些情况下的参数也是如此。
【讨论】:
我不同意这一点。这是语言中引用/指针概念的误用。引用是为了确保在编译时初始化一个值。这是一个非常强大的契约,其中一个声明函数只接受初始化值。 Java 或 C# 等语言缺乏,这迫使开发人员额外检查传递的值是否为 NULL (null)。我没有在合同中看到强制执行我只能接受 const 值。【参考方案4】:使用指针的一个原因是,将NULL
值传递给函数是否有意义。有了指针,它有望做到这一点。有了参考,估计是做不到的。
(但是,通过做一些棘手的事情,仍然可以将 NULL 传递给引用参数。您可以预期在这种情况下被调用的函数可能会崩溃。)
另一个约定是,如果将指针传递给函数,函数可能会使用指针获取对象的所有权(尤其是在类似 COM 的引用计数环境中)。如果你传递一个引用,那么被调用的函数可以期望在函数调用期间使用该对象,但不会保留指向该对象的指针以供以后使用。
【讨论】:
【参考方案5】:我的规则很简单:当你想表明该值是可选的,因此可以是 0 时使用 *。
排除规则:周围的所有 _obj_s 都存储在容器中,您不希望在任何地方使用 foo(*value);
而不是 foo(value);
使您的代码看起来难看
因此,要显示该值不能为 0,请将 assert(value);
放在函数开头。
【讨论】:
以上是关于c ++ * vs&在函数声明中[重复]的主要内容,如果未能解决你的问题,请参考以下文章
C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]