加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:15:35 所属栏目:百科 来源:网络整理
导读:这是一个一般的编程问题.我正在学习C,我已经学会了任何常量变量,即const int i或int * const ptr,必须立即被初始化. 这也是引用地址必须立即初始化的根本原因,因为地址是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?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读