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_1int(或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:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]

在c ++中全局声明的动态数组的多个定义[重复]

opencv中未声明的'true'(首次在此函数中使用)[重复]

C语言 函数声明和定义

用VS2010编写C程序出现"未定义标识符"是怎么回事

C语言-函数的定义声明传参