const成员

[C++系列] 22. const成员

将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。即有''读''的权限,但没有''写''的权限。

 


 
 
  1. void display() const { // 相当于 void display(const Date* const this)
  2. cout << _year << endl; // 可读
  3. _year = 1000; // 不可写
  4. }

我们需要注意的是:this指针类型为:类类型* const ,始终指向调用成员函数对象的地址,其地址不能变,对值无限制。成员函数经const修饰,其值也不能改变。

2. const修饰的四大基本情况

对const的使用在C语言阶段就已然涉及,我们再次回顾学习一遍:


 
 
  1. // const修饰的四大基本情况
  2. const int a = 10;
  3. a = 20; // 编译不通过,a为常量
  4. const int* pa = &a;
  5. pa = &b; // 地址可以改变,pa为指针,不为常量,对指向空间无限制
  6. *pa = 100 // 指向内容不能改变,*pa为常量
  7. int* const pa = &a; // 指针为const,即指针内所存地址不能变,对指向空间加限制
  8. const int* const pa = &a; // 地址不能变,地址中的内容也不能变

3. 调用关系


 
 
  1. class Date {
  2. public:
  3. Date( int year, int month, int day) {
  4. _year = year;
  5. _month = month;
  6. _day = day;
  7. }
  8. Date( const Date& d) {
  9. _year = d._year;
  10. }
  11. void display() const { // 相当于 void display(const Date* const this)
  12. cout << _year << "display() const" << endl; // 可读
  13. }
  14. void display() {
  15. cout << _year << "display()" << endl;
  16. }
  17. private:
  18. int _year;
  19. int _month;
  20. int _day;
  21. };
  22. int main() {
  23. Date d1(2019, 4, 1); // 普通对象
  24. const Date d2(2019, 3, 31); // const对象
  25. d1.display();
  26. d2.display();
  27. system( "pause");
  28. return 0;
  29. }

创建了两个对象,d1、d2,其中d1为普通对象,d2为const对象。在调用display函数时,d1就调用普通的成员函数,d2因为为const对象,不可写,即调用const成员函数。实质上,这两个成员函数构成了重载函数。

当我们把非const成员函数注释掉之后,调用关系又是什么呢?


 
 
  1. class Date {
  2. public:
  3. Date( int year, int month, int day) {
  4. _year = year;
  5. _month = month;
  6. _day = day;
  7. }
  8. Date( const Date& d) {
  9. _year = d._year;
  10. }
  11. void display() const { // 相当于 void display(const Date* const this)
  12. cout << _year << "display() const" << endl; // 可读
  13. }
  14. //void display() {
  15. // cout << _year << "display()" << endl;
  16. //}
  17. private:
  18. int _year;
  19. int _month;
  20. int _day;
  21. };
  22. int main() {
  23. Date d1(2019, 4, 1); // 普通对象
  24. const Date d2(2019, 3, 31); // const对象
  25. d1.display();
  26. d2.display();
  27. system( "pause");
  28. return 0;
  29. }

 测试结果:编译通过,普通对象也调用const成员函数。

那么我们把const成员函数注释掉,调用关系又该怎样变化呢?


 
 
  1. class Date {
  2. public:
  3. Date( int year, int month, int day) {
  4. _year = year;
  5. _month = month;
  6. _day = day;
  7. }
  8. Date( const Date& d) {
  9. _year = d._year;
  10. }
  11. //void display() const { // 相当于 void display(const Date* const this)
  12. // cout << _year << "display() const" << endl; // 可读
  13. //}
  14. void display() {
  15. cout << _year << "display()" << endl;
  16. }
  17. private:
  18. int _year;
  19. int _month;
  20. int _day;
  21. };
  22. int main() {
  23. Date d1(2019, 4, 1); // 普通对象
  24. const Date d2(2019, 3, 31); // const对象
  25. d1.display();
  26. d2.display();
  27. system( "pause");
  28. return 0;
  29. }

测试结果:报错,编译不通过。const对象,调用非const成员函数,直接报错。因为可能内容会被修改,导致直接报错。

总结:权限可以被缩小但不能被放大,普通对象可以调用普通成员函数,也可以调用const成员函数,只是在调用const成员函数时,无法进行''写''操作。而const对象一定不能进行写操作,所以不能调用普通成员函数。并且,普通成员函数内部可以调用const成员函数,而const成员函数内部不能够调用普通成员函数。举一个很直观的例子:一个大胖子的衣服,一个小瘦子能够穿进去,但是,反过来,胖子是穿不上瘦子的衣服的。在此,''可读可写''就相当于胖子,''只读''就相当于瘦子。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值