前言
今天我们来了解一下const成员的基本使用,以及const取地址重载的运用
来开始今天的学习
const成员
1.基本定义,
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的*this指针,表明在该成员函数中不能对类的任何成员进行修改。
一般使用如下:
因为this是隐藏的,使用时const放在函数参数括号之后,表示const Date*this 的作用
2,使用场景
此时可以保证*this的成员不被被修改可以用在一些不修改数时的情景,但是如果是一些计算等值会变化得函数,就不能使用它,比如int operator+=(const Date &d)是一个错误用法
3,const的调用权限
现在有几个问题,如果在函数中同时存在const 成员函数,与非const成员函数的话下面情况,会怎麽样
1. const对象可以调用非const成员函数吗?
是不可以的,这里有权限放大的错误,如下cosnt 的对象相当于d2传过出的是const Date*this,
而printf函数是默认的Date*this函数,那么this由原来的只读不写变成了可读可写,权限放大,会出现错误
const Date d2(2024, 3, 1);d2.printf();
void printf() //Date类里的函数{cout << _year << " " << _month << " " << _day << endl;}
那么怎么修改上面的错误,答案是void printf()const,将非const成员函数变成const成员函数,如此也说明了cosnt对象可以调用cosnt成员函数
2. 非const对象可以调用const成员函数吗?
是可以的,这里有权限缩小,如下cosnt 的对象相当于d2传过出的是Date*this,
而printf函数是默认的const Date*this函数,那么this由原来的可读不写变成了只读可写,权限缩小,在c++中是允许的
Date d2(2024, 3, 1);d2.printf();
void printf()cosnt //Date类里的函数{cout << _year << " " << _month << " " << _day << endl;}
3. const成员函数内可以调用其它的非const对象吗吗?
可以的,通过一个小例子来了解一下 bool Date::operator<( const Date &d) 下图是这样的现在运算符函数重载调用下面两个类的成员分别是一个cosnt成员,一个const成员
如果是d1<d2是可以调用的,因为d1默认变成Date*this,权限平移,而d2由const Data*this变成const Date&d,是权限平移,而如果是d2<d1是不对的因为d2是const Date*this 变成Date*this 权限放大了,是会报错的 bool Date::operator<( const Date &d){}Date d1(2024,2,2);const Date d2(2024, 3, 1); d1<d2//是可以的d1变成Date*this 权限平移 d2<d1 //d2变成Date*this 权限放大 d1缩小权限
总结:一般我们正常使用函数时最好调用const 避免一些不必要的麻烦,除了一些要改变值的数值的一些特殊情况,int operator+=(const Date &d)
4 取地址及const取地址操作符重载
class Date{ public : Date* operator&() { return this ; } const Date* operator&()const { return this ; }private : int _year ; // 年 int _month ; // 月 int _day ; // 日};
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想让别人获取到指定的内容,指定的特殊函数