微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 为什么要立即初始化const变量?

这是一个一般的编程问题.我正在学习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但尚未被初始化.

演示: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?

原文地址:https://www.jb51.cc/c/112064.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐