这是一个一般的编程问题.我正在学习C,我已经学会了任何常量变量,即const int i或int * const ptr,必须立即被初始化.
这也是引用地址必须立即初始化的根本原因,因为地址是const.
但是我找不到为什么必须这样做的原因/为什么这个规则被强加了.
有人可以解释一下吗
解决方法
因为没有办法可以初始化它,也可以分配一个值.
const int size; //no initialization (error) size = 100; //error - you cannot assign a const variable.
现在,如果一个既不具有任何有意义的值的变量也不允许使它变得有价值,因为它是一个常量变量,那么这个变量是什么意思?这是完全没用的.
但是,只有内置和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,以下将给出错误:
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,请参阅这个主题: