方法调用链;返回指针与引用?

Posted

技术标签:

【中文标题】方法调用链;返回指针与引用?【英文标题】: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");

【问题讨论】:

没有性能差异。 【参考方案1】:

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

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

这里看起来引用更合适。

【讨论】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

非常有趣的问题。

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

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

【讨论】:

以上是关于方法调用链;返回指针与引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何调用返回类方法指针的类方法?

(C++) 在同一个类中调用时,取消引用的指针返回正确的值,从 main 调用时返回 0

菊花链函数调用指针

ServerSocket对象调用accept()方法返回一个啥类型的对象?

指针是不是被认为是 C 中通过引用调用的方法?

C++ - 返回指针或常量引用