向類中添加功能可以通過添加一個方法或定義一個將對象作爲其第一個參數的函數來完成。我知道大多數程序員會選擇添加實例方法的解決方案。在實例方法和自由函數之間進行選擇?
但是,我有時更喜歡創建一個單獨的函數。例如,在下面的示例代碼中,將Area
和Diagonal
定義爲自由函數而不是方法。我覺得這樣更好,因爲我認爲這些功能提供了增強功能,而不是核心功能。
這是否被認爲是好的/壞的做法?如果答案是「取決於」,那麼決定添加方法或定義單獨函數的規則是什麼?
class Rect
{
public:
Rect(int x, int y, int w, int h) :
mX(x), mY(y), mWidth(w), mHeight(h)
{
}
int x() const { return mX; }
int y() const { return mY; }
int width() const { return mWidth; }
int height() const { return mHeight; }
private:
int mX, mY, mWidth, mHeight;
};
int Area(const Rect & inRect)
{
return inRect.width() * inRect.height();
}
float Diagonal(const Rect & inRect)
{
return std::sqrt(std::pow(static_cast<float>(inRect.width()), 2) + std::pow(static_cast<float>(inRect.height()), 2));
}
一個側面說明,使用pow的恆定冪數是2,相對於自己拼出x * x + y * y + z * z的效率極低。 – 2010-04-06 19:38:57
@Mark B:謝謝,我不知道。 – StackedCrooked 2010-04-06 21:34:31
查看經典_ [非成員函數如何改進封裝](http://drdobbs.com/cpp/184401197)_。 (「當你認爲封裝時,你應該考慮非成員函數」)另見http://stackoverflow.com/q/1692084/140719。 – sbi 2011-11-25 10:29:09