2014-03-27 43 views
6

修改構造函數C++標準中的const?我正在修改我的struct刪除固定值(默認成員初始值設定器)稍後在構造函數時設置它,但我忘記刪除const關鍵字,並在稍後通知它。令我驚訝的是我沒有得到編譯錯誤,它只是工作正常,但對於測試用例2它給了一個編譯器。他們有什麼不同?是否在構造函數C++標準中修改const?

測試用例1:

struct A 
{ 
    const int x = 2; 

    A() 
     : x(3) 
    { 
    } 
}; 

測試用例2:

struct A 
{ 
    const int x = 2; 

    A() 
    { 
      x = 3; // compile error! error: read-only variable is not assignable 
    } 
}; 
+4

請參閱[這個問題](http://stackoverflow.com/questions/355258/why-must-const-members-be-intialized-in-the-constructor-initializer-rather-than)。這似乎相關。 – blazs

回答

9

在第一個例子你是初始化的常量變量,在第二你是分配一個值給它,之後變量是默認構造的。這些是不同的操作,賦值在初始化後不可能用於常量。

+0

當然,所有與const鑄造一起出窗口 –

1
  1. 事情是,在你的構造函數的主體可以繼續開始玩它的對象之前,對象必須被完全初始化。這意味着必須在內存中保留足夠的空間,新對象的實例將放置在該空間中。

  2. 如果聲明數據成員(int x)是const,從不斷變化的它的價值,它一旦建立禁止自己,這意味着在它的創造的價值必須被設置。

在實施例1首先創建int x並將其設置爲值3(將駐留在內存中爲對象保留的)並且只有你的構造的主體執行後。

在示例2中,您創建了一個新對象(對於您的int x有一些值),並且您試圖在構造函數中修改它,const關鍵字禁止這樣做。

2

此語法的溶液中加入在C++ 11:

struct A 
{ 
    const int x = 2; 

在這種情況下2就像是將被用於的x初始化一個「默認」值。如果在構造函數的初始化列表中初始化x,那麼這就是使用的值。但是,如果你沒有這樣做,那麼使用2

這已被添加到C++ 11中,以避免如果您有多個構造函數時不必在初始化列表中重複某些操作的麻煩。

+0

我已經在使用 –

相關問題