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

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但尚未初始化.

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


此分析还表明,即使内置类型是非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)

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


至于什么使struct/class POD,请参阅此主题:


Oli*_*rth 5

因为如果您可以稍后分配给它们,它们就不会是“const”。

  • @aroth:为了迂腐,一个 `const` 变量不能*永远*被分配。并回答你的观点;您将声明和定义混为一谈。 (5认同)
  • 我认为“稍后”在这里有点误导。似乎`const` 变量的重要属性是它只能被分配*一次*。因此,如果它可以在分配发生后进行分配,那么它就不会是 `const`。但这并不需要在声明时进行分配。所以我认为 OP 的要求是,为什么初始分配必须作为声明的一部分发生? (3认同)
  • 作为一个有趣的旁注(本着这是一个通用编程问题的精神),Java 确实允许在初始声明之后分配 `final` 变量。但只有一次。 (2认同)