方法调用链;返回指针与引用?
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