C++ 内存在什么时候分配给c++;?
据我所知,常量类成员必须在构造函数运行之前初始化,但由于它们不能在类主体中初始化(因为它只是一个原型),因此我们需要在初始化器列表中初始化它。我的问题是内存何时分配给常量变量,执行顺序是什么C++ 内存在什么时候分配给c++;?,c++,C++,据我所知,常量类成员必须在构造函数运行之前初始化,但由于它们不能在类主体中初始化(因为它只是一个原型),因此我们需要在初始化器列表中初始化它。我的问题是内存何时分配给常量变量,执行顺序是什么 class constant { const int a; public: constant(int k):a(k) { cout<<"a is "<<a<<endl; } }; int main()
class constant
{
const int a;
public:
constant(int k):a(k)
{
cout<<"a is "<<a<<endl;
}
};
int main()
{
constant cl(5);
return 0;
}
类常数
{
常数INTA;
公众:
常数(整数k):a(k)
{
cout我认为你对const的看法是错误的。不要把它看成是与实现细节(如内存)或运行时有关的,而应该把它看作是帮助程序员和编译器的一种方法
内存何时分配并不重要(尽管是在构造对象之前,在进入初始值设定项列表之前-不是标准指定的),重要的是您只能初始化初始值设定项列表(C++11之前)中的变量,甚至是const
integral类型的类定义
内存何时分配给常量变量
这里,a
是类常量
的数据成员,因此它被分配为常量
的一部分。无论何时创建常量
的实例,都会包含一个a
请注意,静态
成员是不同的,但仅仅因为a
在初始化后不允许更改,并不使其存储与任何其他常规数据成员不同
…是否有必要在分配内存时初始化常量变量
严格地说,在调用构造函数之前,您必须拥有可用的内存,因此短语的位置有点问题(具体参见AndréCaron关于placement new的评论)
然而,在大多数正常使用中,分配和构造是联系在一起的,并且构造对象时必须初始化常量成员。对象成员的确切内存位置取决于对象创建。
若您通过“new”创建对象,那个么它将是一个堆。
如果创建堆栈对象(如示例中所示),它将是堆栈内存。
“常量”内存-它是“常量”的内存,而不是“常量变量”的内存
换句话说,常量内存用于文本字符串、文本数字(“text”,5),而常量修饰符限制内存更新。如果变量是const
,编译器强制您在初始化后不更改该值。也就是说,您必须对其进行初始化(必须是在某种意义上)
您必须直接初始化它:
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’ */
}
};
没有任何应用程序适用于所有C++实现,因为它没有在标准中指定。技术上来说,在初始化对象之前,可以为对象分配内存(例如,放置<代码>新< /代码>)。不准确。示例中的常量a
与其包含的对象同时被分配。不,您的确切单词是“(虽然它是在您构造对象时,在输入初始值设定项列表之前-不是标准指定的)”。我看到您已编辑,但我的注释仍然有效。“在您构造obejct之前”过于模糊:-)@AndréCaron诚实的错误:)@AndréCaron好吧,你对非标准的东西不能太具体。内存甚至可能不会被分配……它可以。一个具有静态存储持续时间且没有非常量成员的对象可能会被塞进只读内存中(如果编译器能够证明在计划初始化之前没有任何东西读取该值)。嗯,对:我的意思是,它的存储和分配不是独立于包含的对象而确定的