当前位置:   article > 正文

7. C++中类的封装_c++ 类的封装

c++ 类的封装

类通常分为以下两个部分

  1. 类的实现细节
  2. 类的使用方式

       注:当使用类时,不需要关心其实现细节;当创建一个类时,才需要考虑其内部实现细节;

使用手机时,只需要知道如何发短信,打电话,拍照等等即可,不需要关心手机是如何开发出来的。手机开发工程师就需要考虑手机内部的实现细节,如硬件细节和软件细节。

一、封装的基本概念

根据日常生活中的经验:并不是类的每个属性都是对外公开的
        如:女孩子不希望外人知道自己的年龄和体重
        如:一些男孩子不希望别人知道自己的身高和收入
而一些类的属性是对外公开的
        如:人类的姓名,学历,国籍等
因此,需要在类的表示法中定义属性和行为的公开级别,类似文件系统中文件的权限

二、C++中类的封装

成员变量
        C++中用于表示类属性的变量;
成员函数
        C++中用于表示类行为的函数;
在C++中可以给成员变量和成员函数定义访问级别
        public:成员变量和成员函数可以在类的内部和外界访问和调用
        private:成员变量和成员函数只能在类的内部被访问和调用

注意:C++中通过定义类成员的访问级别实现封装机制

类成员的访问属性demo:

  1. #include <stdio.h>
  2. struct Biology
  3. {
  4. bool living;
  5. };
  6. struct Animal : Biology
  7. {
  8. bool movable;
  9. void findFood()
  10. {
  11. }
  12. };
  13. struct Plant : Biology
  14. {
  15. bool growable;
  16. };
  17. struct Beast : Animal
  18. {
  19. void sleep()
  20. {
  21. }
  22. };
  23. struct Human : Animal
  24. {
  25. void sleep()
  26. {
  27. printf("I'm sleeping...\n");
  28. }
  29. void work()
  30. {
  31. printf("I'm working...\n");
  32. }
  33. };
  34. struct Girl : Human
  35. {
  36. private:
  37. int age;
  38. public:
  39. void play()
  40. {
  41. printf("I'm girl, I'm playing...\n");
  42. }
  43. void print()
  44. {
  45. age = 22;
  46. printf("Girl's age is %d\n", age);
  47. play();
  48. sleep();
  49. work();
  50. }
  51. };
  52. struct Boy : Human
  53. {
  54. public:
  55. int age;
  56. void play()
  57. {
  58. printf("I'm boy, I'm playing...\n");
  59. }
  60. void print()
  61. {
  62. age = 23;
  63. printf("Boy's age is %d\n", age);
  64. play();
  65. sleep();
  66. work();
  67. }
  68. };
  69. int main(int argc, char *argv[])
  70. {
  71. Girl girl;
  72. girl.print();
  73. Boy boy;
  74. boy.print();
  75. printf("Press any key to continue...");
  76. getchar();
  77. return 0;
  78. }

编译运行结果如下:

三、类成员的作用域

  • 类成员的作用域都只在类的内部,外部无法直接访问
  • 成员函数可以直接访问成员变量和调用其它成员函数
  • 类的外部可以通过类变量访问public成员
  • 类成员的作用域与访问级别没有关系

注:C++中用struct定义的类的所有成员默认为public

类成员的作用域demo:

  1. #include <stdio.h>
  2. int i = 1;
  3. struct Test
  4. {
  5. private:
  6. int i;
  7. public:
  8. int j;
  9. int getI()
  10. {
  11. i = 3;
  12. return i;
  13. }
  14. };
  15. int main()
  16. {
  17. int i = 2;
  18. Test test;
  19. test.j = 4;
  20. printf("i = %d\n", i);
  21. printf("::i = %d\n", ::i);
  22. //printf("test.i = %d\n", test.i);
  23. printf("test.j = %d\n", test.j);
  24. printf("test.getI() = %d\n", test.getI());
  25. printf("Press any key to continue...");
  26. getchar();
  27. return 0;
  28. }

编译运行结果如下:

四、类的真正形态

struct在C语言中已经有了自己的含义,只能继续兼容。在C++中提供了新的关键字class用于类定义。class和struct的用法是完全相同的。

class和struct有什么区别?

  1. 在用struct定义类时,所有成员的默认属性为public
  2. 在用class定义类时,所有成员的默认属性为private
  1. #include <stdio.h>
  2. struct A
  3. {
  4. int i;
  5. int getI()
  6. {
  7. return i;
  8. }
  9. };
  10. class B
  11. {
  12. int i;
  13. int getI()
  14. {
  15. return i;
  16. }
  17. };
  18. int main(int argc, char *argv[])
  19. {
  20. A a;
  21. B b;
  22. a.i = 1;
  23. a.getI();
  24. b.i = 2;
  25. b.getI();
  26. printf("Press any key to continue...");
  27. getchar();
  28. return 0;
  29. }

编译运行结果如下:

五、一个运算类的实现

要求:
                1. 提供setOperator函数设置运算类型,如加,减,乘,除;
                2. 提供setParameter函数设置运算参数,类型为整型;
                3. 提供result函数进行运算,其返回值表示运算的合法性,通过引用参数返回结果;

  1. //Operator.cpp
  2. #include "Operator.h"
  3. bool Operator::setOperator(char op)
  4. {
  5. bool ret = false;
  6. if( (op == '+') || (op == '-') || (op == '*') || (op == '/') )
  7. {
  8. ret = true;
  9. mOp = op;
  10. }
  11. else
  12. {
  13. mOp = '\0';
  14. }
  15. return ret;
  16. }
  17. void Operator::setParameter(double p1, double p2)
  18. {
  19. mP1 = p1;
  20. mP2 = p2;
  21. }
  22. bool Operator::result(double& r)
  23. {
  24. bool ret = true;
  25. switch( mOp )
  26. {
  27. case '/':
  28. if( (-0.000000001 < mP2) && (mP2 < 0.000000001) )
  29. {
  30. ret = false;
  31. }
  32. else
  33. {
  34. r = mP1 / mP2;
  35. }
  36. break;
  37. case '+':
  38. r = mP1 + mP2;
  39. break;
  40. case '*':
  41. r = mP1 * mP2;
  42. break;
  43. case '-':
  44. r = mP1 - mP2;
  45. break;
  46. default:
  47. ret = false;
  48. break;
  49. }
  50. return ret;
  51. }
  1. //Operator.h
  2. #ifndef _OPERATOR_H_
  3. #define _OPERATOR_H_
  4. class Operator
  5. {
  6. private:
  7. char mOp;
  8. double mP1;
  9. double mP2;
  10. public:
  11. bool setOperator(char op);
  12. void setParameter(double p1, double p2);
  13. bool result(double& r);
  14. };
  15. #endif
  1. //main.cpp
  2. #include <stdio.h>
  3. #include "Operator.h"
  4. int main(int argc, char *argv[])
  5. {
  6. Operator op;
  7. double r = 0;
  8. op.setOperator('/');
  9. op.setParameter(8, 4);
  10. if( op.result(r) )
  11. {
  12. printf("Result is %f\n", r);
  13. }
  14. printf("Press any key to continue...");
  15. getchar();
  16. return 0;
  17. }

编译运行结果如下:

六、总结

类的精华在于封装
       1. 将实现细节和使用方式相分离;

C++中通过public和private实现类的封装
       1. public成员可以通过变量被外界访问;
       2. private成员只能够在类内部使用;

类的定义和实现可以分开到不同的文件中。

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

闽ICP备14008679号