先来带着几个问题来:
为什么要const、mutable声明,const、mutable的运用场景是什么;
1:为什么要有const、mutable声明:
const声明相当于你向系统的一个承诺,承诺不会改变声明对象的值;
但有人想,有必要吗,我不改不就行了吗。当然,如果您一直不改,那声明和不声明const的功效是差不多的,但是事与愿违,很多时候您不小心会改变自己不希望改的值,从而导致bug的产生,而const就是让系统监督这个变量,如果您不小心改变了变量,那么系统就会报错;
而mutable就是在某种特别的情况下,用于违背这个约定的声明;
2:const和mutable的用法:
一般const是运用于指针和类中函数的约束,分3种情况:
(1)不希望改变指针的指向改变
(2)不希望通过指针改变指针指向对象的内容
(3)不希望类中的函数改变类中的变量
可以看出来,这些运用场景都是为了保护某些个量
我们先看第一中场景:
我们知道,定义一个指针的形式为:
int *x;
所以我们不希望指针的指向改变,所以const应该作用于*x,故一个不可改变指向的*x的格式为:
int* const x=&y;
注意,这样的指针应该在定义时就给其赋予一个地址,否则会成为野指针;
这种声明它是可以通过指针改变指向对象的值的;
我们如果希望不可以通过指针改变指向对象的值的话,我们可以通过以下声明完成:
int const* x=&y;
这个时候如果呢通过x改变y的值,那么系统会报错;
但是这种声明它是可以改变指针的指向的,改变指向后仍然不能通过该指针改变指向对象的值;
那么来看类中函数怎么使用const;
有的时候,我们会些一些检测类的函数或者输出类的函数,这些函数往往是不必要改变变量的值的;
如果您有这个述求,那么可以通过const让函数变得更加安全;
看下面的代码:
#include<iostream>
using namespace std;
class A {
int x;
public:
A(int mid) :x(mid){}
void Get_x()const {
cout << x;
}
};
int main() {
A t (1);
t.Get_x();
}
我们可以看到Get_x函数右边有一个const声明,这个声明就是告诉系统,Get_x这个函数不能改变成员变量:
如果我们将Get_x改为:
void Get_x()const {
x=2;
cout << x;
}
那么系统会报错:
但是有的时候,我们又希望在const声明过的函数中改变某些特定的值,比如我们要计算该函数运行了多少次【当然,我们可以通过一个作用域为该文件的变量来实现,但是那会让程序变得混乱】
,我们在类中声明一个mutable变量,即这种变量在const函数也是允许被改变的,像上面那个函数,如果我们将x声明为:
mutable int x;
那么系统不会报错:
#include<iostream>
using namespace std;
class A {
mutable int x;
public:
A(int mid) :x(mid){}
void Get_x() const {
x = 2;
cout << x;
}
};
int main() {
A t (1);
t.Get_x();
}
要注意:类中的static变量它是能够在const声明的类函数中被改变的,即使static变量没有经过mutable声明,因为static变量它是不属于任何一个类实例的,更像是一个作用域为指定类的全局变量;