谈谈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;
}
报错
类型是不匹配的
但如果改成
#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 ,而是产生的有常型的“临时变量(匿名变量)