修饰本身的const不存在权限放大和缩小的问题(因为这实际上是一种拷贝),只有修饰内容的才有这种问题,如果const修饰的是指针,如果const在*左边,修饰的是指针指向的内容,在*右边,指向的是指针本身。像下面这样,const修饰的是i本身,而对于Int j=i,实际上是一种拷贝,所以对于j的修改并不会影响i,不存在权限放大和缩小的问题。
在函数传参时,const修饰指向内容时,和非const拷贝赋值才涉及权限放大和缩小的问题,如下
因为print函数中有隐含的*this指针,在图中为Date *const this,const在*右边,修饰的是指针本身,所以不涉及权限的放大和缩小,但我们用const修饰的是d2的内容,在传参时涉及到了权限的放大,因此无法成功传参,而解决办法就是,在函数括号后加上一个const
加上const后,不止const修饰内容的d2可以使用,普通类型的d1也可以使用,d1使用涉及到权限的缩小,传过去后只能读不能修改,但是是可以正常运行的,因为权限可以缩小不能放大。
注意,函数后面加上const虽好,但是不能乱用因为这会导致普通类无法修改成员变量,所以要结合实际情况来使用。
总结:需要修改成员变量的函数不能加const(如构造函数,+=函数,++函数,--函数),不需要修改的就可以加,建议不修改成员变量的都加上const,方便使用如(print函数,+函数,-函数)。像流插入流提取这些不需要加,因为这些不是成员函数,const修饰的是成员函数的指针*this。对声明和定义分离的函数,声明和定义都要加const(如果需要加的话)