2014-04-01 55 views
0

我知道這個類是一個描述,所以我們不能在其中定義const。但我覺得它讓我不解,第一:在一個類中聲明的Const和Static,C++

class A 
{ 
    private: 
      const int Months=12;// Fails 
}; 

我不知道我是正確的,我想如果有可能是A的許多物體,會有很多常量個月。所以C++禁止它。

但二:

class A 
{ 
    private: 
     static int Montshs =12;//Fails, 
}; 

我也知道個月可以被初始化了A級; 我認爲這是一個描述,所以我們不能用靜態的,A級初始化(我不知道閹我是對的),

但去:

class A 
{ 
    private: 
     static const int Montshs =12;//ok, 
}; 

這將是確定,我不能給自己一些理由。任何人都可以善意告訴我原因嗎?

有沒有人可以給我關於這三個問題的詳細解釋? 我想也許這是關於記憶的安排。

+0

請注意,第一個在當前標準(C++ 11)中是有效的。 – juanchopanza

回答

2
  • 1:const int Months=12;
    這是不允許在C++ 03,但由於C++ 11是允許的。原因正如你所描述的那樣:可能有很多A的實例,所以這不是一個單一的值,而是必須寫入A類的任何對象。在C++ 11中,這個記法用來給那個非靜態成員一個默認值。在C++ 03中,你必須記得在每個構造函數中初始化成員。

  • 2:static int Months =12;這仍然是一個可變其具有在一個單一的翻譯單元被定義。因此,在一個單獨的X.cpp中,設置爲int A::Months = 42;。這樣,變量就會獲得你初始化它的值(在這種情況下爲42),使你在聲明中給出的值(12)相當無用。

  • 3:static const int Montshs =12;這是一個特殊情況,因爲它是一個編譯時常量。它是一個的值,不綁定到A類型的任何單個對象,且不可更改。因此,編譯器可以通過查看標題中的定義獲益,因爲它可以優化符號的任何錯誤,基本上使用值12,無論它看到的是什麼A::Months。它基本上不需要爲它分配存儲空間,因爲它可以在需要時將值12寫入代碼中。這也不總是可能的,一些較老的編譯器不會接受它。然後您將不得不使用enum-Trick:enum { Months = 12 };

+0

你應該補充說'constexpr'可能並且應該和可能性一起使用3。 –

2

這是所有在詳細here

那麼,爲什麼這些不方便的限制存在解釋呢?一個類通常在頭文件中聲明爲 ,而頭文件通常包含在 許多翻譯單元中。但是,爲了避免複雜的鏈接器規則,C++要求每個對象都有唯一的定義。如果C++允許 需要作爲對象存儲在內存中的實體的類定義,那麼該規則 將被破壞。

在C++ 11中這些限制是lifted

C++ 11的基本思想是允許非靜態數據成員 在聲明的位置(在其類中)進行初始化。