为什么必须立即初始化const变量?

时间:2011-12-09 02:38:39

标签: c++ reference initialization const

这是一般编程问题。我正在学习C ++,并且我已经了解到任何const变量,即:const int iint *const ptr,都必须立即初始化。

这也是必须立即初始化对地址的引用的根本原因,因为地址是const

但我无法找到为什么必须这样做/为什么强加这条规则的原因。

有人可以帮我解释一下吗?

4 个答案:

答案 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但尚未初始化。

演示:http://ideone.com/NJT8L


此分析还表明内置类型自动初始化 ,即使它们是非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

演示:http://ideone.com/84vD9


至于构成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 */

这个,我们已经看到进入'文本',因为无论如何都无法改变,但可以保护