簡體   English   中英

在什么時候將內存分配給c ++中的常量變量?

[英]At what point does the memory get allocated to a constant variable in c++?

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

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

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

編輯:常量變量是否需要在分配內存時初始化?

我認為你對const有錯誤的想法。 不要將其視為與實現細節(如內存)或運行時相關,而是將其作為幫助程序員和編譯器的手段。

分配內存的時間並不重要(盡管在構造對象之前,在進入初始化列表之前 - 未由標准指定),重要的是你只能在初始化列表中初始化變量(在C ++之前) 11)甚至是const積分類型的類定義。

何時將內存分配給常量變量

這里, aclass constant的數據成員,因此它被分配 constant 一部分 每當你創建一個constant實例時,就會有a已包含的實例。

需要注意的是static成員是不同的,但僅僅是因為a是不允許初始化后改變,不會使任何其他常規的數據成員的存儲不同。

...是否有必要在分配內存的位置初始化常量變量

嚴格來說,你必須有可用的存儲空間,然后才能調用構造函數,所以在這里是有點問題的程度短語(具體參見安德烈·卡倫的關於投放新評論)。

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

如果變量是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’ */ 
  }
};

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

換句話說,const內存用於文字字符串,文字數字(“text”,5),而const修飾符限制內存更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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