2012-08-08 44 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’ */ 
    } 
}; 
相关问题