这是一个通用的编程问题。我正在学习C++,并且了解到所有const变量(即const int i
或int *const ptr
)都必须立即初始化。
这也是导致必须立即初始化对地址的引用的根本原因,因为地址是const
。
但是我找不到为什么必须这样做的原因/为什么要强加此规则。
有人可以帮我解释一下吗?
最佳答案
因为以后无法初始化它或给它分配值,所以没有办法。
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的原因,请参阅以下主题:
关于c++ - 为什么const变量必须立即初始化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8440381/