2012-08-08 64 views
3

盡我所知,常量類成員必須在構造函數運行之前初始化,但由於它們不能在類體中初始化(因爲它只是一個原型),因此我們需要在初始化程序列表中初始化它。我的問題是什麼時候內存分配給一個常量變量,以及執行的順序是什麼?在什麼時候內存被分配給C++中的一個常量變量?

class constant 
{ 
    const int a; 
    public: 
    constant(int k):a(k) 
    { 
     cout<<"a is "<<a<<endl; 
    } 
}; 

int main() 
{ 
    constant cl(5); 
    return 0; 
} 

編輯:是不是真的,恆定變量需要初始化在他們分配內存的點?

+2

沒有答案將適用於所有C++實現,因爲它沒有在標準中指定。 – 2012-08-08 17:14:02

回答

3

我認爲你對const有錯誤的想法。不要把它看作與實現細節(如內存)或運行時相關的東西,還有更多的方法可以幫助程序員和編譯器。

當內存被分配不要緊,(雖然你構造對象之前,進入初始化列表之前它 - 而不是由標準規定),要緊的是,你只能在初始化程序列表中初始化變量( pre C++ 11)甚至是const整型類的類定義。

+1

從技術上講,您可以在初始化對象之前爲對象分配內存(例如,放置'new')。所以「當你構造物體」是不準確的。示例中的常量'a'與其包含的對象同時被分配。 – 2012-08-08 17:15:47

+0

不,您的確切單詞是「(雖然它是在構建對象時,在輸入初始化程序列表之前 - 未由標準指定)」。 – 2012-08-08 17:17:30

+0

我看到你已經編輯過了,但我的評論就是這樣。 「構建obejct之前」過於模糊:-) – 2012-08-08 17:17:47

1

何時存儲器被分配給一個恆定可變

這裏,aclass constant數據成員,所以它分配作爲constant一部分。無論何時創建constant的實例,都會包含一個a

注意static成員是不同的,但只是因爲a不允許初始化後改變,不會使其存儲從任何其他常規的數據成員不同。

...是必要的,恆定的變量在要分配的內存點進行初始化

嚴格的,你必須有可用的內存之前,你可以調用構造函數,所以短語有點問題(具體請參閱AndréCaron關於展示位置的評論)。

但是,在大多數正常使用中,分配和構造是綁在一起的,並且在構造對象時,const成員的初始化必須發生

+0

它可以。具有靜態存儲持續時間並且沒有非const成員的對象可能被塞入只讀內存(如果編譯器可以證明在計劃初始化之前沒有任何內容讀取該值)。 – 2012-08-08 17:17:21

+0

嗯,真:我的意思是,它的存儲和分配不以某種方式確定_independently_包含對象 – Useless 2012-08-08 17:21:59

0

對象成員的確切內存位置取決於對象的創建。 如果您通過「新建」創建對象,它將是一堆。 如果你創建堆棧對象(就像你的例子),它將是一個堆棧內存。 「常量」內存 - 它是「常量」的內存,而不是「常量變量」。

其他字,用於字面字符串的常量內存,字面數(「text」,5),而const修飾符限制內存更新。

1

如果變量爲const,則編譯器強制您在初始化後不更改該值。也就是說,您必須初始化它(必須在RFC2119的意義上)。

您必須直接初始化:

struct constant { 
    const int a; 
    constant(int k) : a(k) { 
    /* everything is fine here */ 
    } 
}; 

你不能離開它未初始化:

struct constant { 
    const int a; 
    constant(int k) { 
    /* error: uninitialized member ‘constant::a’ with ‘const’ type ‘const int’ */ 
    } 
}; 

而且你不能改變它的施工後的值:

struct constant { 
    const int a; 
    constant(int k) { 
    a = k; 
    /* error: uninitialized member ‘constant::a’ with ‘const’ type ‘const int’ */ 
    /* error: assignment of read-only data-member ‘constant::a’ */ 
    } 
}; 
相關問題