【问题标题】:When Pass by reference becomes mandatory over pass by address/pointer当通过引用传递成为强制通过地址/指针传递时
【发布时间】:2012-04-10 11:56:25
【问题描述】:

有人可以举一些例子,通过引用传递优于通过指针传递。

基本上两者都提供相同的功能,但我想知道在哪里必须通过引用传递。

另外,请建议如何决定使用两者中的任何一个。

请提供一些基本示例。

【问题讨论】:

标签: c++ pointers pass-by-reference


【解决方案1】:

复制构造函数和赋值运算符。

struct A {
  ...
  A(const A& copy);
  A& operator = (const A& copy);
};

这些是强制性的情况。除此之外,还可能存在其他情况(例如重载其他运算符,如+<> 等)。

另外,请建议如何决定使用两者中的任何一个。

在大多数地方我更喜欢引用(更多 C++ 风格),如果不能使用引用,我倾向于使用指针(更多 C 风格)。
参考是const 指针的类比表示;即A& 类似于A* const。因此,它们提供了一些内置的安全性,可防止意外覆盖该位置。

【讨论】:

  • 实际上通过引用传递对于赋值运算符不是强制性的(从标准看来,通过引用返回也不是)。在使用复制和交换习语时,可以简单地传递值,这可能有利于复制省略。
【解决方案2】:

我的简单经验法则是在可能的情况下总是更喜欢通过引用传递。如果您需要传递空值的能力,那么您必须使用指针传递。否则使用通过引用传递。

【讨论】:

    【解决方案3】:

    重载运算符时,必须传递引用。 例如:

    class A {
        A& operator=(const A &other);
    }
    

    【讨论】:

      【解决方案4】:

      复制构造函数必须通过引用获取它们的参数。

      运算符重载必须通过值或引用而不是指针来获取参数。

      对于普通功能,您可以自行选择;虽然如果你想接受空参数或动态数组,你必须使用指针。

      有些人喜欢尽可能使用引用;无需检查它是否为空,也无需混淆它是指单个对象还是数组,或者函数是否可能删除该对象。其他人更喜欢使用指针,因为它在调用站点提供了一个可见的指示,表明该函数可能会更改对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 2014-07-27
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 2021-02-28
        相关资源
        最近更新 更多