Leb*_*156 13 c++ initialization const reference
这是一个通用的编程问题.我正在学习C++,并且我已经了解到任何const变量,即:const int i或者int *const ptr必须立即初始化.
这也是必须立即初始化对地址的引用的根本原因,因为地址是const.
但我无法找到为什么必须这样做/为什么强加这条规则的原因.
有人可以帮我解释一下吗?
Naw*_*waz 21
因为以后无法初始化它或分配值.
const int size; //no initialization (error)
size = 100; //error - you cannot assign a const variable.
Run Code Online (Sandbox Code Playgroud)
现在,如果一个变量既没有任何有意义的值,也不允许你以后使它具有值,因为它是一个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
Run Code Online (Sandbox Code Playgroud)
实际上,NON-POD类型不能保持未初始化,因为将调用默认构造函数,并且对象将被初始化.
现在考虑这个结构,
struct C
{
const int i;
C() {}
};
Run Code Online (Sandbox Code Playgroud)
C绝对是非POD类型,因为它具有用户定义的构造函数.另请注意,在构造函数中,它不会初始化 i哪个int声明为const.由于这个未初始化的consti,以下将给出错误:
const C c; //error -
Run Code Online (Sandbox Code Playgroud)
有人可能认为错误是因为 const在上面的变量声明中c.但那是短视而不是真的.即使你删除const,也会出错:
C c; //error - same error
Run Code Online (Sandbox Code Playgroud)
该错误是因为C::i已声明const但尚未初始化.
此分析还表明,即使内置类型是非POD类型的成员,也不会自动初始化.对于非POD类类型也是如此.
内置类型(和POD类型)的默认初始化语法是这样的:
struct C
{
const int i;
C() : i() {} //note the syntax - it is called member-initialization list
};
Run Code Online (Sandbox Code Playgroud)
现在这是允许的:
C x; //ok
const C y; //ok
Run Code Online (Sandbox Code Playgroud)
至于什么使struct/class POD,请参阅此主题:
因为如果您可以稍后分配给它们,它们就不会是“const”。