谈谈C++中const的那些事

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

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

1有如下代码

#include <iostream>
using namespace std;




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

报错

类型是不匹配的

但如果改成

#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;
}

编译报错

这是报错可以看到问题出在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 ,而是产生的有常型的“临时变量(匿名变量)

猜你喜欢

转载自blog.csdn.net/a15929748502/article/details/81195121