当前位置:   article > 正文

C++之类和对象——封装_c++封装类

c++封装类

封装是C++面向对象的三大特性之一,“对象”包含属性和行为,具有相同属性和行为的对象即可抽象封装为一个“类”。

一、封装的规则

将属性和行为封装为一个类,再用类创建具体的对象,属性和行为均可被设置不同的访问权限,权限分为公共权限、保护权限和私有权限。

若为公共权限,类内可以访问 ,类外也可以访问;

若为保护权限,类内可以访问 ,类外不可以访问,继承时可以访问;

若为私有权限,类内可以访问 ,类外不可以访问,继承时不可以访问。

  1. class Person
  2. {//成员
  3. //成员属性/成员变量
  4. //公共权限
  5. public:
  6. string m_Nationality = "中国";
  7. //保护权限
  8. protected:
  9. string m_Car = "比亚迪";
  10. //私有权限
  11. private:
  12. string m_Phone = "华为";
  13. //成员方法/成员函数
  14. public:
  15. void SetNationality(string nationality)
  16. {
  17. m_Nationality = nationality;
  18. }
  19. //展示国籍、汽车和手机
  20. void Show()
  21. {
  22. cout << m_Nationality << endl;
  23. cout << m_Car << endl;
  24. cout << m_Phone << endl << endl;
  25. }
  26. protected:
  27. void SetCar(string car)
  28. {
  29. m_Car = car;
  30. }
  31. private:
  32. void SetPhone(string phone)
  33. {
  34. m_Phone = phone;
  35. }
  36. };
  37. int main()
  38. {
  39. Person Chou;
  40. Chou.Show();
  41. Chou.m_Nationality = "USA";
  42. //调试报错,成员不可访问
  43. //Chou.m_Car = "Tesla";
  44. //Chou.m_Phone = "iPhone";
  45. Chou.Show();
  46. Chou.SetNationality("中国");
  47. //调试报错,成员不可访问
  48. //Chou.SetCar("Tesla");
  49. //Chou.SetPhone("iPhone");
  50. Chou.Show();
  51. return 0;
  52. }

二、封装的意义

一般在封装类时会将成员属性都设置为私有权限,通过拥有公共权限的成员方法实现读写操作。封装的意义也正是在于此,即保护成员属性不被类外程序直接访问和修改,保护和隐藏成员方法的实现细节避免被无意中破坏,使代码模块化,仅通过保留的对外接口与外部程序交互。

  1. //point.h
  2. #include<iostream>
  3. using namespace std;
  4. class point
  5. {
  6. public:
  7. //设置x坐标
  8. void setx(int x);
  9. //获取x坐标
  10. int getx();
  11. //设置y坐标
  12. void sety(int y);
  13. //获取y坐标
  14. int gety();
  15. private:
  16. //点类的x,y坐标
  17. int p_x;
  18. int p_y;
  19. };
  20. //point.c
  21. #include"point.h"
  22. //设置x坐标
  23. void point::setx(int x)//
  24. {
  25. p_x = x;
  26. }
  27. //获取x坐标
  28. int point::getx()
  29. {
  30. return p_x;
  31. }
  32. //设置y坐标
  33. void point::sety(int y)
  34. {
  35. p_y = y;
  36. }
  37. //获取y坐标
  38. int point::gety()
  39. {
  40. return p_y;
  41. }
  42. //circle.h
  43. #include<iostream>
  44. using namespace std;
  45. #include"point.h"
  46. class Circle
  47. {
  48. public:
  49. void setr(int r);
  50. double getr();
  51. void setcenter(point center);
  52. point getcenter();
  53. private:
  54. int c_r;
  55. //另一个类也可做本类中的成员
  56. point c_center;
  57. };
  58. //circle.c
  59. #include"Circle.h"
  60. void Circle::setr(int r)//设置半径
  61. {
  62. c_r = r;
  63. }
  64. double Circle::getr()//获取半径
  65. {
  66. return c_r;
  67. }
  68. void Circle::setcenter(point center)
  69. {
  70. c_center = center;
  71. }
  72. point Circle::getcenter()
  73. {
  74. return c_center;
  75. }
  76. //main.c
  77. #include"circle.h"
  78. #include"point.h"
  79. //判断点和圆关系
  80. void Isincircle(Circle& c, point& p)
  81. {
  82. //计算点和圆心距离的平方
  83. int d =
  84. (c.getcenter().getx() - p.getx()) * (c.getcenter().getx() - p.getx()) +
  85. (c.getcenter().gety() - p.gety()) * (c.getcenter().gety() - p.gety());
  86. //计算圆半径的平方
  87. double R = c.getr() * c.getr();
  88. //判断关系
  89. if (d > R)
  90. {
  91. cout << "点在圆外" << endl;
  92. }
  93. else if (d < R)
  94. {
  95. cout << "点在圆内" << endl;
  96. }
  97. else
  98. {
  99. cout << "点在圆上" << endl;
  100. }
  101. }
  102. int main()
  103. {
  104. //设置圆对象
  105. Circle c;
  106. c.setr(10);
  107. //设置点对象
  108. point p;
  109. p.setx(10);
  110. p.sety(0);
  111. //设置圆对象中的圆心(点对象)
  112. point center;
  113. center.setx(0);
  114. center.sety(0);
  115. c.setcenter(center);
  116. //判断关系
  117. cout << "圆心为(0,0),半径为10" << endl;
  118. cout << "点坐标为(10,0)" << endl;
  119. Isincircle(c, p);
  120. return 0;
  121. }

当圆半径为10时:

当圆半径为5时:

当圆半径为15时:

三、struct和class的区别

1.封装

struct中的成员默认为公共权限,class中的成员默认为私有权限。

  1. class A
  2. {
  3. //默认为私有权限
  4. int m_A;
  5. };
  6. struct B
  7. {
  8. //默认为公共权限
  9. int m_B;
  10. };
  11. int main()
  12. {
  13. A a;
  14. //报错
  15. //a.m_A = 1;
  16. //cout << a.m_A << endl;
  17. //可执行
  18. B b;
  19. b.m_B = 2;
  20. cout << b.m_B << endl;
  21. return 0;
  22. }

2.继承

在子类继承父类时,编译器默认的继承方式为私有继承;而子结构体继承父结构体时,编译器默认的继承方式为公有继承。

  1. struct A
  2. {
  3. public:
  4. int a1;
  5. protected:
  6. int a2;
  7. private:
  8. int a3;
  9. };
  10. //默认继承方式为公有继承
  11. struct B :A
  12. {
  13. public:
  14. int b;
  15. //B对A为公有继承,因此在类B中可以访问A中的公有成员和保护成员,但不能访问私有成员
  16. void func()
  17. {
  18. this->a1 = 1;
  19. this->a2 = 2;
  20. //this->a3 = 3;
  21. cout << this->a1 << " ";
  22. cout << this->a2 << " ";
  23. }
  24. };
  25. void test1()
  26. {
  27. B the_B;
  28. //B对A为公有继承,因此通过B创建的对象可以访问A中的公有成员,但不能访问保护成员和私有成员
  29. the_B.a1 = 0;
  30. //the_B.a2 = 0;
  31. //the_B.a3 = 0;
  32. the_B.b = 0;
  33. cout << "struct:" << endl;
  34. the_B.func();
  35. cout << the_B.b;
  36. cout << endl << endl << endl;
  37. }
  38. class C
  39. {
  40. public:
  41. int c1;
  42. protected:
  43. int c2;
  44. private:
  45. int c3;
  46. };
  47. //默认继承方式为私有继承
  48. class D:C
  49. {
  50. public:
  51. int d;
  52. //D对C为私有继承,因此在类D中可以访问C中的公有成员和保护成员,但不能访问私有成员
  53. void func()
  54. {
  55. this->c1 = 10;
  56. this->c2 = 20;
  57. //this->a3 = 30;
  58. cout << this->c1 << " ";
  59. cout << this->c2 << " ";
  60. }
  61. };
  62. void test2()
  63. {
  64. D the_D;
  65. //D对C为私有继承,因此通过D创建的对象不可以访问C中任何成员
  66. //the_D.c1 = 0;
  67. //the_D.c2 = 0;
  68. //the_D.c3 = 0;
  69. the_D.d = 0;
  70. cout << "class:" << endl;
  71. the_D.func();
  72. cout << the_D.d;
  73. cout << endl << endl << endl;
  74. }
  75. int main()
  76. {
  77. test1();
  78. test2();
  79. return 0;
  80. }

 

3.总结

C++中仍然引入结构体,主要是为了保持和C语言的兼容性。无论是封装还是继承,class和struct之间的根本区别都是在于其默认的访问权限设置。而在使用时,如果用来存储数据集合等轻量级对象时,选择struct;如果用来表示数据量大、逻辑复杂的对象时,选择class。

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

闽ICP备14008679号