这是一般编程问题。我正在学习C ++,并且我已经了解到任何const变量,即:const int i
或int *const ptr
,都必须立即初始化。
这也是必须立即初始化对地址的引用的根本原因,因为地址是const
。
但我无法找到为什么必须这样做/为什么强加这条规则的原因。
有人可以帮我解释一下吗?
答案 0 :(得分:20)
因为以后无法初始化或分配值。
const int size; //no initialization (error)
size = 100; //error - you cannot assign a const variable.
现在,如果一个变量既没有任何有意义的值,也不允许以后使它具有值,因为它是一个 const 变量,那么这个变量的意义是什么呢? ?这完全没用。
但是,仅适用于内置和POD类型:
struct A{}; //POD type
struct B{ B(){} }; //Non POD type because it has user-defined constructor!
const int i; //error - built-in type
const A a; //error - POD type
const B b; //ok - Non POD type
//likewise
const std::string s; //ok - std::string is a non-POD
const std::vector<std::string> v; //ok - std::vector is a non-POD
实际上,NON-POD类型不能保持未初始化,因为将调用默认构造函数,并且对象将被初始化。
现在考虑这个结构,
struct C
{
const int i;
C() {}
};
C
绝对是非POD类型,因为它具有用户定义的构造函数。另请注意,在构造函数中,它不是初始化 i
,它是int
,声明为const
。由于这个未初始化的const
i,以下内容会出错:
const C c; //error -
有人可能认为错误是由于上述变量const
声明中的c
。但那是短视而不是真的。即使您删除const
,也会出错:
C c; //error - same error
错误是因为C::i
被声明为const
但尚未初始化。
此分析还表明内置类型不自动初始化 ,即使它们是非POD类型的成员。对于非POD类类型也是如此。
内置类型(和POD类型)的默认初始化的语法是这样的:
struct C
{
const int i;
C() : i() {} //note the syntax - it is called member-initialization list
};
现在允许这样做:
C x; //ok
const C y; //ok
至于构成struct / class POD的内容,请参阅以下主题:
答案 1 :(得分:4)
因为如果你以后可以分配它们,它们就不会是“常量”。
答案 2 :(得分:0)
不允许在程序中赋值给const变量,因为那时你可能会改变它的值,这显然是错误的!!
因此,您需要初始化它们。
希望有所帮助
答案 3 :(得分:0)
当变量声明为const时,意味着变量是只读的,并且不能更改。所以为了使变量只读,它应该在声明时初始化。
为了更好地理解变量,请查看以下程序
每个进程基本上由4个部分的地址空间组成,进程运行时可以访问
文本 - 此部分包含要执行的实际m / c指令。在许多操作系统上,这被设置为只读,因此该过程不能修改其指令。这允许程序的多个实例共享文本的单个副本。
数据 - 此部分包含程序的数据部分。它进一步分为
1)初始化只读数据 - 包含由程序初始化的数据元素,并且只在执行过程中读取它们。
2)初始化读写数据 - 包含由程序初始化的数据元素,并将在流程执行过程中进行修改。
3)未经初始化的数据 - 包含未由程序初始化的元素,并在进程执行前设置为0。这些也可以修改并称为BSS(块起始符号)。这些元素的adv是,系统不必在该区域的程序文件中分配空间,b'coz在进程开始执行之前由OS初始化为0。
Stack - 此部分用于局部变量,堆栈帧
堆 - 此部分包含动态分配的内存
int abc = 1; ----> Initialized Read-Write Data
char *str; ----> BSS
const int i = 10; -----> Initialized Read-Only Data
main()
{
int ii,a=1,b=2,c; -----> Local Variables on
Stack
char *ptr;
ptr = malloc(4); ------> Allocated Memory in Heap
c= a+b; ------> Text
}
数据,存储数据文本,商店代码
链接器生成的文件有3个(主要?)段/部分。 text - 程序文本(显然是const char数组。也许是其他'const'数组,因为那些无论如何都无法改变)。我对阵列部分不是100%肯定,也许有人会纠正我。
数据 - 初始化的全局数据。见下面的例子。 bss - 未初始化的全球数据。以下是一些例子
int x = 1; /* goes into data */
int y; /* goes into bss */
const int z = 1;/* goes into text */
这个,我们已经看到进入'文本',因为无论如何都无法改变,但可以保护