[英]static free functions or member functions for helpers?
假設您具有以下非靜態成員函數:
// .h
struct C {
void f();
}
現在假設你想實現C::f
使用特定於某些子功能C::f
,使其更短更易讀; 例如:
// .cpp
void C::f() {
h1();
h2();
//...
hn();
}
假設許多h()函數不需要訪問任何數據成員。 這意味着您可以將函數定義為靜態自由函數(在一個.cpp中)或作為成員函數(靜態或非靜態)。
你會讓它們成為靜態自由函數或C的函數成員嗎?
第一種情況的一個優點是您不必在C
聲明它們:
// .cpp
static void h1() {//...}
static void h2() {//...}
static void hn() {//...}
此外,如果我沒有錯,則不存在全局命名空間污染的風險,因為它們是靜態的 ,即它們只能從同一單元.cpp內的其他函數中看到(其中C :: f也被定義)。
而在第二種情況下,你將不得不在C
聲明它們,盡管如我所說,它們只應該被C::f
。
// .h
struct C {
void f();
private:
static void h1(); // can be either static or non-static
static void h2();
static void hn();
}
// .cpp
void C::h1() {//...}
void C::h2() {//...}
void C::hn() {//...}
我認為第二個版本導致膨脹的代碼是沒有充分理由的,最重要的是如果您最終必須拆分其他長成員函數(如C::f
以使代碼更具可讀性。
我建議使用匿名命名空間:
namespace {
void C::h1() {/...}
void C::h2() {/...}
void C::h3() {/...}
}
(見這個問題 )
這樣,您可以保證函數在定義的文件之外不可見,因此您絕不會污染您的全局命名空間 - 這將是我對自由靜態函數的主要關注。
使它們成為類的私有成員會向全世界公開函數接口(當您發布* .h文件時),從而使接口更加復雜無緣無故。 (這里可以添加更多參數,例如更改私有函數定義時的更高編譯時間)
搜索“匿名命名空間”會導致對此主題進行一些有趣的討論。
只有你可以回答這個問題。 如果它們永遠不會在C::f
之外使用,那么污染全局命名空間就沒有意義了。 我個人會把它們變成C
成員函數。 如果它們可以被標記為靜態,那么這樣做,但是如果它們真的只對f
很重要,那么只需將它們命名為指示它的東西,並且不要擔心static
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.