【问题标题】:Method Call Chaining; returning a pointer vs a reference?方法调用链;返回指针与引用?
【发布时间】:2014-01-18 19:08:54
【问题描述】:

我有一个Text 类,它具有某些返回指向自身的指针的方法,允许链接调用。 (原因是我只是喜欢链接的外观和感觉,老实说!)

我的问题是,在实践中通常哪个更好(在安全性 > 多功能性 > 性能方面)?返回和使用引用?还是返回并使用指针?

两者的例子,从指针版本开始:

class Text{
public:
    Text * position(int x, int y){
        /* do stuff */
        return this;
    }
    Text * write(const char * string);
    Text * newline();
    Text * bold(bool toggle);
    Text * etc();
    ...
};

textInstance.position(0, 0)->write("writing an ")->bold(true)->write("EXAMPLE");
textInstance.position(20, 100)
           ->write("and writing one across")
           ->newline()
           ->write("multiple lines of code");

相对于参考版本:

class Text{
public:
    Text & position(int x, int y){
        /* do stuff */
        return *this;
    }
    Text & write(const char * string);
    Text & newline();
    Text & bold(bool toggle);
    Text & etc();
    ...
};

textInstance.position(0, 0).write("writing an ").bold(true).write("EXAMPLE");
textInstance.position(20, 100)
            .write("and writing one across")
            .newline()
            .write("multiple lines of code");

【问题讨论】:

  • 没有性能差异。

标签: c++ pointers reference coding-style return


【解决方案1】:

指针和引用的区别很简单:指针可以为空,引用不能。

检查您的 API,如果返回 null 有意义,可能表示错误,请使用指针,否则使用引用。如果你确实使用了指针,你应该添加检查以查看它是否为空(这样的检查可能会减慢你的代码)。

这里看起来引用更合适。

【讨论】:

  • 噢,我没想到。返回 nullptr 的可能性会导致方法调用背靠背链接失败。
  • 或者,您仍然可以使用引用并抛出异常,而不是返回空指针。
【解决方案2】:

为此使用引用是规范的;优先级:ostream::operator<<。这里的指针和引用,出于所有普通目的,都具有相同的速度/大小/安全性。

【讨论】:

    【解决方案3】:

    由于nullptr 永远不会被返回,我推荐参考方法。它更准确地表示了返回值的使用方式。

    【讨论】:

      【解决方案4】:

      非常有趣的问题。

      我认为在安全性或多功能性方面没有任何区别,因为您可以使用指针或引用来做同样的事情。我也不认为在性能上有任何明显的差异,因为引用是通过指针实现的。

      但我认为使用引用更好,因为它与标准库一致。例如,iostream 中的链接是通过引用而不是指针来完成的。

      【讨论】:

        猜你喜欢
        • 2011-12-10
        • 1970-01-01
        • 2014-11-19
        • 2012-05-09
        • 1970-01-01
        • 2011-02-19
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多