3

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

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

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

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

4

4 回答 4

3

我认为您对const. 较少将其视为与实现细节(如内存)或运行时相关,而更多地认为它是帮助程序员和编译器的一种手段。

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

于 2012-08-08T17:13:55.503 回答
1

什么时候将内存分配给常量变量

这里,a是 的一个数据成员class constant,所以它是作为 的一部分分配的 constant。每当您创建 的实例时constant,都会a包含一个。

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

...是否有必要在分配内存的时候初始化常量变量

严格来说,在调用构造函数之前,您必须拥有可用的内存,因此where的短语有点问题(具体参见 André Caron 关于放置 new 的评论)。

但是,在大多数正常使用中,分配和构造是联系在一起的,并且必须在构造对象时进行 const 成员的初始化。

于 2012-08-08T17:15:13.527 回答
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’ */ 
  }
};
于 2012-08-08T17:38:49.143 回答
0

对象成员的确切内存位置取决于对象创建。如果您通过“新”创建对象,它将是一个堆。如果您创建堆栈对象(如您的示例),它将是一个堆栈内存。“常量”内存——它是“常量”的内存,而不是“常量变量”的内存。

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

于 2012-08-08T17:16:15.940 回答