C++ 中的 const 类型变量

         之前总感觉C/C++中有const 限定的变量是个很头痛的问题,一会儿能够变。一会儿不能够变,一会儿把const赋给nonconst,一会儿又把nonconst赋给const,头都被它搞大了。今天刚好把《C++ primer》中的相关部分又读了一遍,所以就把相关的内容写出来总结一下啦!

         首先,我们能够想想为什么要设计const变量这样的东西,只是就是想有个常量嘛!所以对const类型变量进行操作的核心原则就是不能改变该变量的值。其它操作的话。const还是不const影响事实上不大。

        然后我们能够想到的是,既然在程序运行过程中。不能改变const变量的值,那么我们在对该变量进行定义的时候就必须对它进行初始化。

对于像int,double这种普通变量来说。初始化一般有例如以下三种方式:

const int i = fun(); //利用函数返回值初始化
const int j = 42;//字面值
const int k = i;//其它变量
        这里我们值得注意的是第一种和第三种的赋值方式。

我们可能会有这种疑问,万一i的类型或者fun函数的返回值的类型不是const int类型的怎么办呢?这时候我们就能够想想前面提到过的那个原则了。

因为赋值仅仅是将一个变量的值赋给另外一个。从此之后两者就基本上每什么关系了。

所以不会对原来const类型变量的值产生影响。

所以赋值操作全然能够无视等号两边的变量类型。

        普通类型变量的const相关问题还是非常easy的,以下就再来讲讲reference(引用)和pointer(指针)的相关问题。我们都知道引用类型也是必需要初始化的,而且在初始化之后不能再将该引用指向其它的变量。

这点与指针有非常大的不同。所以我们全然能够觉得引用本身就是const的,由于它自己的值是不能改变的。

如今我们有以下四个赋值语句:

int       j
const int i;

const int &r1 = i;
int       &r2 = j;
const int &r3 = j;
int       &r4 = i;
       非常明显,前面两条的赋值语句是不会有不论什么问题的,由于等号两变的变量类型是全然一样的。其实我们全然能够将一个const类型的引用指向一个nonconst类型的变量。就像第三个等式一样。由于我们仅仅要保证变量的值不能通过r3进行改变就能够了。至于实际上j的值变不变是不在r3的管辖范围之内的,或者说即使变了也无所谓,j本来就是nonconst类型的。可是,假设反过来将一个noncosnt类型的引用指向一个const类型的变量就不行了,由于你此时能够同过r4去改变一个const类型变量的值。

      最后我们来看看指针类型的const问题。例如以下所看到的,对于一个指针变量来说。const通常会存在在两个位置:

int        a;
const int *p = &a;
int *const q = &a;

        对于第一种类型。我们能够和对引用的操作做一个类比,事实上是几乎相同的。那么对于第二中声明怎么解读呢?正如《C++ primer》中所说的那样,我们能够从变量開始从右往左读,q前面首先是const。

所以q自己的值是不变的。

再往做是 int*,因此q就是一个指向int类型的const变量。由于q本身是const的,所以它的值不能改变,始终指向变量a。

        总之。说究竟还是开头说过的那句话,const类型变量的核心原则是它的值不能改变。仅仅要以此进行推断。无论是references to const 。pointers to const,consts pointer,还是const赋值给nonconst,nonconst赋值给const,我想都不是问题啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值