C++学习笔记:const和mutable的多种用法【Cherno】

先来带着几个问题来:

为什么要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变量它是不属于任何一个类实例的,更像是一个作用域为指定类的全局变量;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值