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

时间:2013-12-31 23:35:32

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

我有一个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");

4 个答案:

答案 0 :(得分:3)

使用引用是正常的;优先权:ostream::operator<<。对于所有普通用途,此处的指针和引用都具有相同的速度/尺寸/安全性。

答案 1 :(得分:2)

由于永远不会返回nullptr,我建议使用参考方法。它更准确地表示将如何使用返回值。

答案 2 :(得分:2)

指针和引用之间的区别非常简单:指针可以为null,引用不能。

检查您的API,如果能够返回null是否有意义,可能表示错误,请使用指针,否则使用引用。如果使用指针,则应添加检查以查看它是否为空(并且此类检查可能会降低代码速度)。

这里的参考看起来更合适。

答案 3 :(得分:1)

非常有趣的问题。

我认为安全性或多功能性没有任何区别,因为你可以用指针或参考做同样的事情。我也认为没有任何明显的性能差异,因为引用是通过指针实现的。

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