常量对象

10.PNG

常量成员函数

11_LI.jpg

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. class sample
  4. {
  5. public:
  6. int x;
  7. sample(int);
  8. void GetSample(void);
  9. void PrintSample(void) const;
  10. };
  11. sample::sample(int _x):x(_x)
  12. {
  13. cout<<"Constructor Called"<<endl;
  14. }
  15. void sample::GetSample(void)
  16. {
  17. cout<<x<<endl;
  18. }
  19. void sample::PrintSample(void) const
  20. {
  21. x=3;//Error 常量成员函数不可以修改成员变量的值
  22. GetSample();//Error 常量成员函数不可以调用非静态成员函数
  23. cout<<x<<endl;
  24. }
  25. int main(void)
  26. {
  27. const sample s(2);//OK 常量对象可以调用构造函数
  28. s.PrintSample();//Ok 常量对象可以调用自己的常量成员函数
  29. s.x=3;//Error 常量对象的成员变量不可以修改
  30. s.GetSample();//Error 常量对象不可以调用非静态成员函数
  31. return 0;
  32. //2
  33. }

注意:如果一个成员函数中没有调用非常量成员函数,也没有修改成员变量的值,那最好把它写成常量 成员函数

常量成员函数的重载

两个成员函数,名字和参数表都一样,然而一个是const一个不是,算重载

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. class sample
  4. {
  5. private:
  6. int n;
  7. public:
  8. sample(void);
  9. void PrintSample(void);
  10. void PrintSample(void) const;
  11. };
  12. sample::sample(void)
  13. {
  14. n=1;
  15. }
  16. void sample::PrintSample(void)
  17. {
  18. cout<<2*n<<endl;
  19. }
  20. void sample::PrintSample(void) const
  21. {
  22. cout<<n<<endl;
  23. }
  24. int main(void)
  25. {
  26. sample s1;
  27. const sample s2;
  28. s1.PrintSample();//这里调用的是非常量成员函数 2
  29. s2.PrintSample();//这里调用的是常量成员函数 1
  30. return 0;
  31. }

ps.一个成员函数的non-const和const版本同时存在(重载)的话,常量对象只会调用const版本,非常量对象只会调用non-const版本