详解const关键字,int const* p 与const int* p的区别,c++const修饰成员函数的细节

const修饰的常量

在c语言中有常量和变量之分,常量就是不可以被修改的量,包括defince定义的常量,自带的常量,以及const修饰的常量,下面我们将从基础c语言语法讲起,带大家总结一下c++中const的用法

const int 与 int const

先说结论:const int 与 int const 是同一种含义,都表示这个变量不可以被修改。
在这里插入图片描述

const int* p 与 int* const p

先说结论,const int* p 表示p指针指向的内容不可以被修改,即表示p指针指向的内容是一个常量。
而int* const p 表示p指针本身是一个常量,即p指针这个指针不能被修改,而p指针指向的内容是可以被修改的。
在这里插入图片描述

在这里插入图片描述

c++中隐含的const this指针

我们前面讲过,同一个类实例化出的对象独占成员属性,而共用成员方法,对象里面不存放函数,函数独立存放在内存空间中,那么我们如何判断是哪个对象调用的函数呢?
于是c++就给我们引入了编译器默认带的this指针

void DatePrint() 
{
	cout  << _year <<endl;
	cout << _month << endl;
}
int main() {
	Date d1;
	d1.DatePrint();
}

比如下面这个日期类的print方法,在编译过程中,就会被编译器自动生成一个this指针。

void DatePrint(Date* const this ) 
{
	cout  << this->_year <<endl;
	cout << this->_month << endl;
}
int main() {
	Date d1;
	d1.DatePrint(&d1); //传对象的指针
}

上述就是被编译器修饰过的Print函数以及调用函数。
注意,this指针作为形参是编译器给我们写的,我们不能写会报错,但是我们可以用它。
在这里插入图片描述
这里的this,是Date* const 类型,证明this本身不能被修改。
在这里插入图片描述
而this指向的内容可以被修改,例如构造函数里的this
在这里插入图片描述

const 与权限

我们前面讲过,const修饰的变量权限只有读,不能修改,而非const修饰的变量既能读又能写,而参数传递时权限只能由大到小
比如我们在日期类里定义一个DatePrint()函数。
在这里插入图片描述
在这里插入图片描述
可以看到他会正常打印出 2022-10-1;
这时我们再定义一个函数F
在这里插入图片描述
f的形参是const Date* ,即传进来一个Date对象的地址,并且用const修饰他,使这个地址指向对象不能被修改,这时再用这个对象的地址调用对象的print方法,发现报错了。
在这里插入图片描述
这是因为这里的d指针是const Date类型的,保护了指针指向的内容。而DatePrint()函数的形参是默认的 Date const this类型的,只保护了this本身,不保护this指向的内容,这里参数的传递本质上是一次赋值,而在赋值的过程中,d的权限小(内容不可以被修改),而this的权限大(内容可以被修改),于是报错了。
那么为了解决这种问题,我们第一时间想到的就是给DatePrint()函数的形参this修改为 const Date* const this,让他的权限匹配d1,且print函数本身也不会修改对象属性,逻辑符合。
但是问题又出现了,this指针是编译器自己生成的,我们无权写this形参,于是c++引入了const成员。

const 成员

将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改
在这里插入图片描述
在这里插入图片描述
用const修饰类的成员后,就不会报错啦。
在这里插入图片描述

总结 const修饰类成员函数的几道面试题

const对象可以调用非const成员函数吗?

答案不能,const对象权限小,非const成员函数权限大,需要给非const成员函数加上const

非const对象可以调用const成员函数吗?

可以,权限大到小不影响

const成员函数内可以调用其它的非const成员函数吗?

不行,因为权限应用在形参的创建上,const成员函数内的形参this,表示对象不可以被修改,而非const成员函数里的形参this只保证this本身不被修改。

非const成员函数内可以调用其它的const成员函数吗?

可以,权限大到小不影响。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值