当前位置:   article > 正文

const成员函数 以及 取地址及const取地址操作符重载

const成员函数 以及 取地址及const取地址操作符重载

目录

const成员函数

结论:

取地址及const取地址操作符重载


const成员函数

        将const 修饰的 成员函数 称之为 const成员函数 const 修饰类成员函数,实际修饰该成员函数的(*this) ,表明在该成员函数中 不能对类的任何成员进行修改
        this指针本来就是const,函数后的const修饰的是对象,表示不能对对象进行修改。
        我们来看看下面的代码
  1. class Date
  2. {
  3. public:
  4. Date(int year, int month, int day)
  5. {
  6. _year = year;
  7. _month = month;
  8. _day = day;
  9. }
  10. void Print()
  11. {
  12. cout << "Print()" << endl;
  13. cout << "year:" << _year << endl;
  14. cout << "month:" << _month << endl;
  15. cout << "day:" << _day << endl << endl;
  16. }
  17. void Print() const
  18. {
  19. cout << "Print()const" << endl;
  20. cout << "year:" << _year << endl;
  21. cout << "month:" << _month << endl;
  22. cout << "day:" << _day << endl << endl;
  23. }
  24. private:
  25. int _year; // 年
  26. int _month; // 月
  27. int _day; // 日
  28. };
  29. void Test()
  30. {
  31. Date d1(2022,1,13);
  32. d1.Print();
  33. const Date d2(2022,1,13);
  34. d2.Print();
  35. }
请思考下面的几个问题:
        1. const对象可以调用非 const 成员函数吗?(不可)
        2. 非 const 对象可以调用 const 成员函数吗?(可以)
        3. const成员函数内可以调用其它的非 const 成员函数吗?(不可)
        4. 非 const 成员函数内可以调用其它的 const 成员函数吗?(可以)

结论:

        只要成员函数中不需要修改成员变量(不需要修改对象),最好都加上const

取地址及const取地址操作符重载

        这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
  1. class Date
  2. {
  3. public :
  4. Date* operator&()
  5. {
  6. return this ;
  7. }
  8. const Date* operator&()const
  9. {
  10. return this ;
  11. }
  12. private :
  13. int _year ; // 年
  14. int _month ; // 月
  15. int _day ; // 日
  16. };
        这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!
例如:
  1. class A
  2. {
  3. public:
  4. // 我们不实现,编译器会自己实现,我们实现了编译器就不会自己实现了
  5. // 一般不需要我们自己实现
  6. // 除非不想让别人取到这个类型对象的真实地址
  7. A* operator&()
  8. {
  9. return nullptr;
  10. }
  11. const A* operator&() const
  12. {
  13. return (const A*)0xffffffff;
  14. }
  15. private:
  16. int _a1 = 1;
  17. int _a2 = 2;
  18. int _a3 = 3;
  19. };
  20. int main()
  21. {
  22. A aa1;
  23. const A aa2;
  24. cout << &aa1 << endl;
  25. cout << &aa2 << endl;
  26. return 0;
  27. }

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助

欢迎各位点赞,收藏和关注哦

如果有疑问或有不同见解,欢迎在评论区留言哦

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/608192
推荐阅读
相关标签
  

闽ICP备14008679号