簡體   English   中英

C ++:通過類或實例訪問const成員變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM