0

假设需要实现 getter/setter(我也尽量避免使用它们,因为它们通常表明设计不佳)。以下两个变体中哪个变体更好,每个变体的含义是什么?

可能性(1):

class Foo;
class Bar
{
public:
    const Foo& getFoo() const {return foo_;}
private:
    Foo foo_;
};

或 (2):

class Foo;
class Bar
{
public:
    void getFoo(Foo& foo) const {foo = foo_}
private:
    Foo foo_;
};

就个人而言,我总是使用第一个变体,因为我发现它更直观。在第二个变体中,您必须在调用 getFoo 之前构造 Foo 对象,该对象将保存 getFoo 的结果,然后将 getFoo 引用传递给该对象。这个变体对我来说有违直觉,但有些人更喜欢 secodn 变体。出于什么原因,第二个变体可能优于第一个变体?

4

3 回答 3

7

输出论据应被视为刑事犯罪。它更难使用,但尤其难以维护,因为它在代码中不可见。如果分配了某些东西,那就很清楚了。如果在对象上调用一个方法,那么它可能会修改它。但是如果它只是传递给一个函数,普通的维护程序员不会怀疑它被修改了。另外,大多数情况下,它需要额外的行来声明一个临时变量来接受该值。

这种东西主要是那些停留在C89,不知怎么学了C++语法的人写的。但是对于 C++ 11 的 C++ 复制省略和移动语义,我认为没有任何正当理由值得让代码更难阅读。

Of course if you are returning a member, you can return const reference to it. If the value is computed, just return by value and copy elision will take care of it most of the time.

于 2012-10-25T13:00:38.993 回答
0

在一般情况下,第一个变体当然是优选的。由于返回值优化 (RVO),它的效率不低于秒,因为返回的对象没有被复制并且没有性能开销。

如果您需要对传递的对象进行一些初步设置或使用一些部分副本,则第二种变体可能更可取。但这当然不再是微不足道的 getter,而是一些具有不同语义的不同功能。

使用第二个变体的另一个可能原因 - 当传递的对象不能由持有类直接创建时,例如它的创建被某个工厂封装,并且您不想让您的类依赖于这个工厂。

于 2012-10-25T12:54:37.490 回答
0
const Foo& getFoo() const {return foo_;}
于 2012-10-25T13:00:08.553 回答