![](/img/trans.png)
[英]Does each variable in C/C++ point to a constant address in memory?
[英]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
積分類型的類定義。
何時將內存分配給常量變量
這里, a
是class 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.