这是一个通用的编程问题。我正在学习C++,并且了解到所有const变量(即const int iint *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,即声明为intconst。由于这个未初始化的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的原因,请参阅以下主题:
  • Can't C++ POD type have any constructor?
  • 关于c++ - 为什么const变量必须立即初始化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8440381/

    10-11 23:04
    查看更多