【问题标题】:Should I use a class method or pass an object by reference?我应该使用类方法还是通过引用传递对象?
【发布时间】:2020-10-05 01:43:37
【问题描述】:

int getArea(const Square& s);int Square::getArea() const; 都做同样的事情,是否有时一个比另一个更可取?

【问题讨论】:

  • 并不是 Dr. Drobbs 的文章是错误的——但在链接到 已有 20 年历史的文章时要非常谨慎...当 Win98 和 SuSE 7.0 风靡一时.
  • 如果需要将免费功能转为好友,会员优先。如果您可以在没有友谊的情况下实现免费功能,那么您的封装可能是正确的。

标签: c++


【解决方案1】:

getArea() 是否需要使用Square 的私有成员?如果是这样,您需要将非成员函数 (int getArea(const Square& s);) 声明为 friend。共识是,在这种情况下,您应该更喜欢成员表单 (int Square::getArea() const;)。

但是,如果您已经拥有允许将 int getArea(const Square& s); 设为非朋友的公共成员函数(在您的示例中可能是 int Square::getSide() const;)怎么办?然后是一个权衡。从class Square维护的角度来看,最好使用非成员形式,据说可以提高类的封装性(换句话说,更少的函数可以访问私有变量)。

但是,如果该类有很多用户,您可能希望将所有可能的函数都设为成员,这样用户就不需要记住哪些是非成员。此外,IDE 还可以让成员函数更容易被发现(在 Visual Studio 中,一旦按下“.”,就会得到所有可用公共函数的列表)。

有一些尝试来消除这种权衡。一个激进的想法是消除所有非虚拟公共功能,如果需要,让非成员friends。它可以与更广泛接受的 NVI 原则(非虚拟接口,即使所有虚拟功能不公开)相结合。有了这个想法,您可以在不牺牲封装的情况下获得一致的接口。不幸的是,这违背了长期以来的 C++ 传统。

另一个想法是改变语言本身——让它把x.f()f(x)当作同义词,甚至允许使用成员语法调用非成员函数。有人向C++委员会提出了建议,但他们无法就细节达成一致。

【讨论】:

  • 我们已经有了2[x]x[2],别再找陌生人了。
【解决方案2】:

第一种形式是程序化的,第二种形式是面向对象的。

class 中的第一个形式确实没有意义,它是一种反模式。它只在像 C 这样没有类但也没有引用的语言中真正相关。

只有当你有一个结构或类时,第二种形式才有意义。

简而言之,请使用第二种形式,除非您有非常令人信服的理由不这样做。

【讨论】:

  • 使用非成员函数没有错。这种替代语法不会使设计不那么面向对象。在某些情况下,首选非会员。
  • @Eugene 你将不得不更具体地限定它。
  • @Tadman:不需要;我们行业中最知名的专家已经这样做了。 :) stackoverflow.com/q/1692084/4386278
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2012-05-20
  • 2015-04-10
  • 2012-04-28
  • 2017-01-27
  • 2012-10-31
  • 1970-01-01
  • 2011-05-11
相关资源
最近更新 更多