[英]Free function versus member function
擁有一個自由函數(在匿名命名空間中並且只能在單個源文件中訪問)並將所有變量作為參數發送,而不是擁有一個沒有任何參數的私有類成員函數並直接訪問成員變量有什么好處?
標題:
Class A {
int myVariable;
void DoSomething() {
myVariable = 1;
}
};
來源:
namespace {
void DoSomething2(int &a) {
a = 1;
}
}
int A::SomeFunction() {
DoSomething2(myVariable); // calling free function
DoSomething(); // calling member function
}
如果您更喜歡讓它們成為成員,那么如果我首先調用一個未訪問任何成員變量的函數,但該函數調用另一個正在訪問成員的函數,該怎么辦。 它們都應該是成員函數還是免費的?
看到這個問題: Effective C++ Item 23 Prefer non-member non-friend functions to member functions and also C++ Member Functions vs Free Functions
您應該更喜歡自由函數,因為它會促進松散耦合。
僅當它適用於您的類的內部並且您認為它確實與您的類緊密相關時,才考慮將其設為成員函數。
這是101 C++ 編碼標准一書中的一個觀點,它指出比成員函數更喜歡自由函數和靜態函數。
盡管這可能被認為是基於意見的,但它允許保持類很少,並分開關注。
這個答案指出:“這條規則的原因是,通過使用成員函數,你可能會意外地過度依賴類的內部結構。”
源文件中非成員函數的一個優點類似於Pimpl 慣用法的優點:如果您更改實現,使用您的頭文件的客戶端不必重新編譯。
// widget.h
class Widget
{
public:
void meh();
private:
int bla_;
};
// widget.cpp
namespace {
void helper(Widget* w) // clients will never know about this
{ /* yadayada */ }
}
void widget::meh()
{ helper(this); }
當然,這樣寫的時候, helper()
只能使用Widget
的公共接口,所以收益不大。 您可以將helper()
的friend
聲明放在Widget
但在某些時候您最好切換到成熟的 Pimpl 解決方案。
自由函數與成員函數的主要優勢在於它有助於將接口與實現分離。 例如, std::sort
不需要知道它所操作的底層容器的任何信息,只要它被授予對提供某些特征的容器的訪問權(通過迭代器)。
在您的示例中, DoSomething2
方法對減少耦合沒有太大作用,因為它仍然必須通過引用傳遞來訪問私有成員。 幾乎可以肯定,在普通的DoSomething
方法中進行狀態突變更明顯。
當您可以根據類的公共接口實現任務或算法時,就很適合制作免費功能。 Scott Meyers 在這里總結了一套合理的規則: http : //cpptips.com/nmemfunc_encap
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.