[英]C++: access const member vars through class or an instance?
在C ++中,有沒有理由不通過類實例訪問靜態成員變量? 我知道Java對此皺眉,並想知道它是否在C ++中很重要。 例:
class Foo {
static const int ZERO = 0;
static const int ONE = 1;
...
};
void bar(const Foo& inst) {
// is this ok?
int val1 = inst.ZERO;
// or should I prefer:
int val2 = Foo::ZERO
...
};
我有第二個問題。 如果我聲明一個靜態double,我必須在某處定義它,並且該定義必須重復該類型。 為什么必須重復這種類型? 例如:
In a header:
class Foo {
static const double d;
};
In a source file:
const double Foo::d = 42;
為什么我必須在cpp文件中重復“const double”部分?
我更喜歡Foo::ZERO
不是inst.ZERO
因為它更清楚地告訴我們發生了什么。 但是,在類Foo
的方法中,我只會使用ZERO
。
至於獎金問題, const
只是完整類型的一部分。
對於第一個問題,除了風格問題(它顯然它是一個類變量並且沒有相關對象),Fred Larsen在對問題的評論中提到了前面的問題。 閱讀亞當羅森塔爾的回答是非常好的理由,為什么你要小心這一點。 (如果弗雷德將其作為答案發布,我會對其進行投票,但我不能相信它應該歸還的地方。我向亞當投票了。)
至於你的第二個問題:
為什么我必須在cpp文件中重復“const double”部分?
您必須主要重復該類型作為實現細節:它是C ++編譯器解析聲明的方式。 這對於局部變量也不是非常理想的,並且C ++ 1x(以前的C ++ 0x)使用auto
關鍵字來避免需要對常規函數變量重復。
所以這:
vector<string> v;
vector<string>::iterator it = v.begin();
可以成為這樣:
vector<string> v;
auto it = v.begin();
沒有明確的理由為什么這也不適用於靜態,所以在你的情況下thos:
const double Foo::d = 42;
很可能成為這個。
static Foo::d = 42;
關鍵是要有一些方法將此識別為聲明。
請注意我說沒有明確的理由:C ++的語法是一個活着的傳奇:它是非常難以涵蓋其所有的邊緣情況。 我不認為上述內容是模棱兩可的,但可能是。 如果不是,他們可以將其添加到語言中。 告訴他們...對於C ++ 2x:/。
鑒於您將它們聲明為靜態並使它們成為類常量,我會使用Foo :: Zero將意圖傳達給隨意且不那么隨意的代碼讀者。
我還將替換常量的全部大寫名稱,即將Foo :: ZERO轉換為Foo :: Zero。 預處理器宏的常規約定是將它們全部用大寫命名,並且對C ++常量使用類似的命名方案會遇到麻煩,因為預處理器可能會對您的C ++常量進行調整,最終會得到非常有趣的錯誤消息。
我會用Foo :: ZERO,但那只是我。 特別是如果你來自Foo,這會讓人感到困惑。
對於第二個問題,您需要為double值創建內存,這在實現單元中發生。
我認為你不需要創建內存的唯一類型是const整數類型。 然后,您可以將值放在頭文件中。 但由於它沒有地址,因此除非將定義放在.cpp文件中,否則無法通過引用函數來傳遞它。 (這似乎是它與gcc一起使用的方式)。
在您的示例中使用哪種形式無關緊要。 它們都意味着同樣的事情。 我更喜歡一般使用類方法,因為你可能並不總是有一個實例方便使用點運算符。
如果你考慮有人寫一個模板函數,那么有兩個選項是很好的。 他們可能用點運算符編寫了函數。 具有靜態類成員的類仍可用於實例化模板,因為支持該語法。
至於你的獎金問題,那就是語言的方式。 您始終必須聲明完整類型。 您可能應該在另一個問題中提出這個問題。
我個人使用匿名枚舉。 盡管最終結果完全相同:)
至於你的問題。 我肯定更喜歡Foo :: Zero,因為通過查看它所訪問的內容顯而易見。 inst.Zero要求你事先弄清楚什么類型的inst。
您必須重復數據類型,因為這就是C ++的工作原理。 如果您在頭文件中編寫以下內容,則采用相同的方式。
extern int foo;
你還需要提一下
int foo
在CPP文件中。 正如pukku提到的那樣,你聲明了一個類型為“const int”的變量。 因此,必須在變量的定義中重復“const int”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.