欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

谈谈C++中const的那些事

程序员文章站 2022-05-05 15:57:09
...

首先Const的作用是什么呢?大家知道const修饰一个变量之后所修饰的变量就只可以看而不可以改了。

下面我们来看几个有关于const问题的例子。

1有如下代码

#include <iostream>
using namespace std;




int main ()
{
        const   int   a=10;
        int&  b=a;
}

报错

谈谈C++中const的那些事

类型是不匹配的

但如果改成

#include <iostream>
using namespace std;




int main ()
{
        const   int   a=10;
        const int&  b=a;
}

 

就不会报错。也就是说const修饰的变量不可以变成没有被const修饰的变量。(这样也防止了一个不允许改变的变量被自己的别名修改)

同理一个常量默认是一个const类型,也就是说给常亮起别名时要加上const

#include <iostream>
using namespace std;




int main ()
{
        const   int   a=10;
        const int&  b=a;
        const int&c=100;
        int& d=100;
}

 

我们再验证一下

#include <iostream>
using namespace std;




int main ()
{
        int   a=10;
        const int&  b=a;
}

 

编译后发现并没有报错,于是我们可以得出结论;如果是const就不可以给非const(权限被放大),而如果是非const却可以给const(权限被缩小),也就是说权限制可以被缩小不可以被放大。正是因为权限可以缩小,才可以给那些不可以改变数值的参数前加上const已达到保护数据不被修改的作用。

2.请看以下代码

#include <iostream>
using namespace std;




int main ()
{
        int i=0;
        double d=1.111;
        i=d;
        int &j=d;
        return   0;
}

 

编译报错

谈谈C++中const的那些事

这是报错可以看到问题出在int&  j=d;

可当代码改成

#include <iostream>
using namespace std;




int main ()
{
        int i=0;
        double d=1.111;
        i=d;
        const int &j=d;
        return   0;
}

 

时又可以通过编译,这是为什么呢。

我们知道当int   i=d;这样的赋值时会先产生一个“临时变量(匿名变量)”这个变量具有常性,把d的类型转换成int再进行赋值。

同理const  int&  j=d;的原因是j引用的其实不是d ,而是产生的有常型的“临时变量(匿名变量)