在什么时候将内存分配给c ++中的常量变量?

时间:2012-08-08 17:10:30

标签: c++

据我所知,常量类成员必须在构造函数运行之前初始化,但由于它们无法在类体中初始化(因为它只是一个原型),因此我们需要在初始化列表中初始化它。我的问题是什么时候内存被分配给一个常量变量,执行的顺序是什么?

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

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

编辑:常量变量是否需要在分配内存时初始化?

4 个答案:

答案 0 :(得分:3)

我认为你对const有错误的想法。少考虑它与实现细节(如内存)或运行时相关,以及更多作为帮助程序员和编译器的方法。

何时分配内存并不重要(尽管在构造对象之前,在进入初始化列表之前 - 未由标准指定),重要的是你只能在初始化列表中初始化变量(pre C ++ 11)甚至是const整数类型的类定义。

答案 1 :(得分:1)

  

何时将内存分配给常量变量

此处,aclass constant的数据成员,因此将分配为 constant的一部分。每当您创建constant的实例时,都会包含a

请注意,static成员不同,但仅仅因为a在初始化后不允许更改,因此不会使其存储与任何其他常规数据不同构件。

  

...是否有必要在分配内存

的位置初始化常量变量

严格来说,在调用构造函数之前必须先让内存可用,所以中的短语有点问题(具体请参见AndréCaron关于贴图新的评论)。

但是,在大多数正常使用中,分配和构造都绑定在一起,并且在构造对象时必须初始化const成员

答案 2 :(得分: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’ */ 
  }
};

答案 3 :(得分:0)

对象成员的精确内存位置取决于对象创建。 如果你通过“new”创建对象,它将是一个堆。 如果你创建堆栈对象(就像你的例子那样),它将是一个堆栈内存。 “常量”内存 - 它是“常量”的内存,而不是“常量变量”。

换句话说,const内存用于文字字符串,文字数字(“text”,5),而const修饰符限制内存更新。