当前位置:   article > 正文

C++类中const修饰的函数与重载_const重载

const重载

一、重载的定义

重载声明是指在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。返回值的类型不同,不能作为重载函数的判断依据。

  1. // 如下举例一组重载函数:
  2. void fun(int a);
  3. void fun(int a,int b);
  4. void fun(double a,int b);
  5. void fun(double a,double b);
  6. void fun(const char* str);
  7. void fun(char* str);

二、值传递作为参数,加const不构成重载

  1. int test(const int a)
  2. {
  3. return a;
  4. }
  5. int test(int a)
  6. {
  7. return a;
  8. }
  9. int main()
  10. {
  11. int value = 1;
  12. std::cout << test(value) << std::endl;
  13. system("pause");
  14. return 0;
  15. }

编译出错,因为这是值传递,value只是把值传进去了,并不是把自己传进去

 三、指针、引用作为参数加const构成重载

  1. int test(const int* a)
  2. {
  3. return *a;
  4. }
  5. int test(int* a)
  6. {
  7. return *a;
  8. }
  9. int main()
  10. {
  11. int a = 1;
  12. std::cout << test(&a) << std::endl;
  13. const int b = 2;
  14. std::cout << test(&b) << std::endl;
  15. system("pause");
  16. return 0;
  17. }

编译,运行 正常。因为传入的是指针,它是引用传递,这个const是有效的,它会影响到底传进去的这个指针能不能被修改。

 四、类里的成员函数加const构成重载

  1. class MyClass
  2. {
  3. public:
  4. int test()
  5. {
  6. m_num = 1;
  7. return m_num;
  8. }
  9. int test() const
  10. {
  11. return 2;
  12. }
  13. private:
  14. int m_num = 0;
  15. };
  16. int main()
  17. {
  18. MyClass my1;
  19. const MyClass my2;
  20. std::cout << my1.test() << std::endl;
  21. std::cout << my2.test() << std::endl;
  22. system("pause");
  23. return 0;
  24. }

运行

原理:

非const对象调用的是没有const修饰的函数,而const对象调用的是用const修饰的函数。

因为类的成员函数的参数中,其实还有一个隐式的this指针,它会在在调用的时候传入。

在非const修饰的函数中,this指针也是非const的。在const修饰的函数中,this指针是const修饰的。
 

参考:

C++ 重载运算符和重载函数 | 菜鸟教程

C++类中const修饰的函数与重载_未来之大神的博客-CSDN博客

C++ 加const能不能构成重载的几种情况_learner_pu的博客-CSDN博客_变量前有无const是否可以重载

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

闽ICP备14008679号