2.4const修饰成员函数—深度刨析

标题:const修饰成员函数

常函数:
1.成员函数后加const我们称这个函数为常函数
2.常函数不可以修改成员熟悉
3.成员属性加上关键字mutable后,在常函数中依然可以修改

常对象:
1.声明对象前加上const我们称该对象是常对象
2.常对象只能调用常函数

这一小结我们还是要继续深刨析this指针来帮助我们理解这个const

首先我们来理解这个this指针到底是什么?
先来看一段代码:

在这里插入图片描述

报错!错误信息:=左边必须是可修改的左值。意思就是不能改变this的指针指向,这是不是和我们第一篇文章讲的指针常量非常的像,所以我们可以推断出this指针的本质是person *const this。为什么是this指针,就因为他的名字是this。所以本质就是指针常量。(如果不熟悉指针常量和常量指针,可以去看本人的置顶文章,讲的非常清除)

既然解释清楚了这个this指针是什么东西,现在就来分别讲解常函数的性质:
语法:
类型 名字()const{…}
例子:person fun ()const{…}

有没有想过一个问题:为什么const要加在()后面而不是其他位置,我们来看看以下几种错误情况:

  1. const person fun (){…}这是大家比较熟悉的,返回值是const不能修改。
  2. person const fun (){…}说实话这种其实我也几乎没见到,我去验证了一下,上图片:在这里插入图片描述

报错信息的字面意思是提示我们代码中的左值应该是一个可以增加(或减少)的一个操作数,即左侧被赋值的数应该是一个变量,不能是常量。原因也很简单:我们在对某一个值进行自增或自减的操作时,希望保留的是计算后的值,变量可以很容易地在原始地址上保留计算后的值,而常量则不能被自增自减所修改,故出此错误。

3.person fun const(){…}
在这里插入图片描述
写法错误

4.person fun (const){…}这个我们熟,将形参给const了

所以我们就只剩下person fun ()const {…}这种写法了

常函数不可以修改成员属性
我们要怎么理解?因为我们知道它的语法:person fun ()const {…},那他的本质又是什么呢?其实就是在this指针面前加了一个const,前面我们知道了this指针其实是person * const this,所以我们在这个前面再加一个const就变成了:const person * cnost this,this就即是常量指针又是指针常量了,不仅不可以修改指向还不能通过this修改成员变量的值。(对指针常量和常量指针不熟悉的朋友可以去看我的置顶,讲的很清楚)
上图片验证:
在这里插入图片描述

特殊:成员属性声明时加关键字mutable后,再常函数中依旧可以修改变量的值:

这就是一个特例。mutable的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。在C++中,mutable也是为了突破const的限制而设置的。

上图片:
在这里插入图片描述
完全没有问题。

语法:
声明对象前加上const我们称该对象是常对象;
例子:const person p;
性质1:常对象不能修改里面成员的值,但是被mutable修饰的变量可以修改
在这里插入图片描述
p.a赋值语句错了,下面出现了红色的波浪线,但是p.b并没有错。

性质2:常对象只能调用常函数
例子:(这么些有危险,常量以后的值无法修改,所以我们应该在创建时对p进行赋值)

在这里插入图片描述

可以调用完全没有问题。

我们再来看看它调用普通成员函数:
在这里插入图片描述

看吧不兼容,报错了,不能调用,为什么不能调用?可以这么理解:我们知道常函数不能修改对象里成员变量的值,但是我们假设普通成员函数里面有一句a=10;那么普通成员函数可以修改成员变量的值,相当于侧面修改了常量的值!但是,什么是常对象?意思就是对象是常量,不能修改!所以我们可以理解为防止误操作,所以不能用常对象调用普通成员函数。

以上内容掺杂了个人观点,如有错误欢迎大家指正,有问题的小伙伴也可以留言在评论区。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值