假设Foo
是一个相当大的数据结构。我应该怎样写一个const
返回实例的虚函数Foo
,如果我不知道继承的类是否会存储Foo
内部;因此,允许通过引用返回。如果我无法在内部存储它,我的理解是我无法返回const
引用它,因为它将是临时的。它是否正确?这两个选项是:
virtual Foo foo() const { ... }
virtual Foo const & foo() const { ... }
这是一个相关问题 https://stackoverflow.com/questions/2182408/return-a-const-reference-or-a-copy-in-a-getter-function但从不同的角度来看。
您对值返回和 const 引用返回之间的差异感兴趣只是为了优化问题,但事实并非如此。有一个本质上的不同meaning每次返回不同的值与每次返回一个引用(很可能是同一个对象,很可能可以修改)之间:
const Foo &a = myobj.foo();
myobj.modify_the_foo();
const Foo &b = myobj.foo();
a == b; // do you want this to be true or false?
调用者需要知道它是什么,既因为程序员需要知道含义,又因为编译器需要知道调用约定,因此不能将它们混合在同一虚函数的不同重写中。如果一些派生类想要执行其中一项操作,而另一些派生类则想要执行另一项操作,那么运气不好,他们不能,任何一个都不能返回一个int
和另一个float
.
你也许可以返回一个shared_ptr
。这样,“想要”返回引用的派生类可以创建一个shared_ptr
使用不执行任何操作的删除器(但要注意 -shared_ptr
如果原始对象被破坏,它将悬空,这不是您通常期望从返回的shared_ptr
。所以如果这对Foo
为了比它来自的对象活得更长久,那么类最好动态分配它,通过shared_ptr
,并返回该副本的副本,而不是无所事事的删除器)。 “想要”返回值的派生类每次都可以分配一个新值。自从Foo
是“相当大”,希望成本shared_ptr
与您无论如何都要创建要返回的新值相比,动态分配并不算太痛苦。
另一种可能是转Foo
到一个小的 pImpl 风格的类中,该类引用了一个相当大的数据结构。如果涉及的所有内容都是不可变的,那么“想要返回引用”的情况可以在多个之间共享大数据结构Foo
实例。即使不是,您也可以考虑写时复制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)