大家好,我是苏貝,本篇博客带大家了解C++的const成员+取地址运算符重载,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
1. const成员
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
const成员函数是给this指针添加了第一个const,确保在该成员函数中不能对类的任何成员进行修改。第二个const是this指针自带的,表示不能修改this的指向
现在给日期类的成员函数Print用const修饰
发现const对象(d2)和非const对象(d1)都可以调用const成员函数(Print)。
为什么?const成员函数的隐含形参是const Date* const this,非const对象(d1)的类型是Date,由Date->const Date,权限缩小,可以。
const对象(d2)的类型是const Date,由const Date->const Date,权限平移,可以。
去掉日期类的成员函数Print的const
发现只有非const对象(d1) 可以调用非const成员函数(Print),const对象(d2)不能调用非const成员函数(Print)
为什么?非const成员函数的隐含形参是Date* const this,非const对象(d1)的类型是Date,由Date-> Date,权限平移,可以。
const对象(d2)的类型是const Date,由const Date-> Date,权限放大,不可以,报错。
总结:
如果成员函数对成员变量只读,建议该函数用const修饰,这样const对象和非const对象都能使用
如果成员函数对成员变量读写,该函数不能用const修饰,否则不能修改成员变量
请思考下面的几个问题:
-
const对象可以调用非const成员函数吗?
-
非const对象可以调用const成员函数吗?
-
const成员函数内可以调用其它的非const成员函数吗?
-
非const成员函数内可以调用其它的const成员函数吗?
-
不可以,权限放大了
-
可以,权限缩小了
-
不可以,权限放大了
-
可以,权限缩小了
2. 取地址及const取地址操作符重载
这两个默认成员函数一般不用重新定义 ,编译器默认会生成
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容,如:只想让const对象取地址,非const对象返回nullptr
3. 总结
构造函数和析构函数:
对内置类型不做处理,调用自定义类型的构造/析构函数
拷贝构造和赋值运算符重载:
对内置类型值拷贝,调用自定义类型的拷贝构造/赋值运算符重载
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️