• C++核心编程之类和对象---C++面向对象的三大特性--封装


    目录

    类和对象

    类和对象的概念

    C++面向对象的三大特性

    一、封装

    封装案例1:设计一个学生类,可以给姓名和学号赋值,可以显示学生的姓名和学号。

    二、访问权限

    访问权限有三种

    struct和class的区别

    三、成员属性私有化

    成员属性私有化的优点:

    四、封装案例

    案例1:设计立方体类

    案例2:点和圆的关系


    类和对象

    面向对象编程(OOP)是现代编程的基石之一。C++是一种支持OOP的语言,允许你创建类(Class)和对象(Object)。

    类和对象的概念

    1. 类是对对象的抽象。类是一种抽象的数据类型。它们的关系是,对象是类的实例,类是对象的模板。对象是通过new className产生的,用来调用类的方法;类的构造方法 。

    2. 类的意义:

      2-1.类是把属性和方法进行封装,同时对类的属性和方法进行访问控制。

      2-2.类是由我们根据客观事物抽象而成,形成一类事物,然后用类去定义对象,形成这类事物的具体个体。

      2-3.类是一个数据类型,类是抽象的,而对象是一个具体的变量,是占用内存空间的。

    3. 类的访问控制

      在C++中可以对类的属性和方法定义访问级别,public修饰的属性和方法,可以在类的内部访问,也可以在类的外部进行访问。private修饰的属性和方法,只能在类的内部进行访问。

    4. 行为

      所有对象公有操作即成员函数(通常习惯为public属性)属性:所有对象公有特性即数据成员(通常习惯为protected属性)

    C++面向对象的三大特性

    C++面向对象的三大特性为:封装,继承,多态。

    封装目的是实现代码模块化,继承目的是实现代码扩展,静态多态的目的是函数重载和泛型编程,动态多态的目的是虚函数重写。

    C++认为万事皆为对象,对象上有其属性和行为

    例如:

    人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭、唱歌…

    车也可以作为对象,属性有轮胎、方向盘、车灯...行为有载人、放音乐、放空调...

    具有相同性质的对象,我们 可以抽象称为类,人属于人类,车属于车类

    一、封装

    封装是C++面向对象的三大特性之一,封装就是将数据和行为有机结合起来,形成一个整体。把数据和处理数据的操作结合形成类,数据和函数都是类的成员。

    1.封装的意义:

    • 将属性和行为作为一个整体,表现生活中的事务
    • 将属性和行为加以权限控制

    2.语法:

    class   类名{访问权限:属性/行为}

    示例:通过一个圆类中的行为得到圆的周长

    1. #include
    2. #include
    3. using namespace std;
    4. // 圆周率
    5. const double PI = 3.14;
    6. // 设计一个圆类   求圆的周长
    7. // class(一个类) 类名
    8. // class代表设计一个类,类后面紧跟着的就是类的名称
    9. class circle {
    10. // 访问权限
    11. // 公共权限
    12. public:
    13. // 属性
    14. // 半径
    15. int r;
    16. //行为:一般为函数
    17. // 获取周长
    18. double calculateZC()
    19. {
    20. return 2 * PI * r;
    21. }
    22. };
    23. int main()
    24. {
    25. // 通过圆类创建具体的圆(对象)
    26. // 实例化   ( 通过一个类  创建一个对象的过程 )
    27. circle c1;
    28. // 给圆对象 的属性进行赋值
    29. c1.r = 10;
    30. cout << "圆的周长:" << c1.calculateZC() << endl;
    31. return 0;
    32. }

    运行结果:

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    封装案例1:设计一个学生类,可以给姓名和学号赋值,可以显示学生的姓名和学号。

    1. #include
    2. #include
    3. using namespace std;
    4. // 设计一个学生类,属性有姓名和学号
    5. // 可以给姓名和学号赋值,可以显示学生的姓名和学号
    6. // 设计学生类
    7. class student {
    8. public// 公共权限
    9. // 类中的属性和行为  我们统一称为  成员
    10. // 属性  成员属性   成员变量
    11. // 行为  成员函数   成员方法
    12. // 属性
    13. string name;
    14. int id;
    15. // 行为
    16. // 显示姓名与学号
    17. void showstu()
    18. {
    19. cout << "姓名: " << name << "  学号: " << id << endl;
    20. }
    21. // 可以通过对象的行为给属性赋值
    22. void setname(string i_name)
    23. {
    24. name = i_name;
    25. }
    26. void setID(int i_id)
    27. {
    28. id=i_id;
    29. }
    30. };
    31. int main()
    32. {
    33. // 创建一个具体的学生
    34. // 实例化对象
    35. class student s1;
    36. // 给s1属性赋值
    37. s1.setname("张三");
    38. s1.id = 01;
    39. s1.showstu();
    40. class student s2;
    41. // 给s2属性赋值
    42. s2.name = "李四";
    43. s2.id = 02;
    44. s2.showstu();
    45. class student s3;
    46. // 通过对象的行为给属性赋值
    47.     s3.setname("王五");
    48.     s3.setID(03);
    49.     s3.showstu();
    50. return 0;
    51. }

     

    运行结果:

     

    二、访问权限

    类在设计时,可以把属性和行为放在不同的权限下,加以控制。

    访问权限有三种

     1. public          公共权限                成员 类内类外都可以访问

     2. protected   保护权限                成员 类内可以访问,类外不可以访问(有继承关系,父子关系)

     3. private            私有权限                成员 类内可以访问,类外不可以访问(父子关系也不可以访问)

    示例:

    1. #include
    2. using namespace std;
    3. class person{
    4. public:
    5. // 公共权限
    6. string name;
    7. protected:
    8. // 保护权限
    9. string car;
    10. private:
    11. // 私有权限
    12. int password;
    13. public:
    14. void fun()
    15. {
    16. name = "张三";
    17. car = "BMW";
    18. password = 123456;
    19. }
    20.     // 不管哪种形式在类内都是可以访问的
    21. };
    22. int main ()
    23. {
    24. // 实例化具体的对象
    25. class person p1;
    26. p1.name = "李四";
    27. p1.car = "AMG"// 保护权限的内容在类外是不能访问的
    28. p1.password = 258258; // 私有权限的内容在类外是不能访问的
    29. return 0;
    30. }

     

    报错显示:

     

    struct和class的区别

    在c++中struct和class唯一的区别就在于默认的访问权限不同

    区别:

     struct 默认是公共权限

     class 默认是私有权限

     

    示例:

    1. #include
    2. using namespace std;
    3. class C1
    4. {
    5. int m_A;// 默认权限   是私有
    6. };
    7. struct C2
    8. {
    9. int m_A;// 默认权限  是公共
    10. };
    11. int main ()
    12. {
    13. class C1 c1;
    14. c1.m_A=1000;
    15. struct C2 c2;
    16. c2.m_A=100;
    17. return 0;
    18. }

     

    报错显示:

     

    三、成员属性私有化

    成员属性私有化的优点:

     1. 将所有成员属性设置为私有,可以自己控制读写权限

     2. 对于写权限,可以检测数据的有效性

    示例:

    1. #include
    2. #include
    3. using namespace std;
    4. // 设计一个人类
    5. class person{
    6. // 设计一个public 的公共接口
    7. public:
    8.     // 设置姓名
    9.     void set_name(string in_name)
    10. {
    11.             name = in_name;
    12. }
    13.     // 获取姓名
    14.     string get_name()
    15.     {
    16.         return name;
    17. }
    18.     // 设置年龄
    19.     void set_age(int in_age)
    20.     {
    21.         if(in_age<=0||in_age>150){
    22. cout<<"你输入的年龄有误!"<
    23.             return;
    24.         }
    25.         age=in_age;
    26. }
    27.     // 获取年龄
    28.     int get_age()
    29.     {
    30.         return age;
    31.     }
    32.     // 设置情人,只写
    33.     void set_lover(string in_lover)
    34.     {
    35.         lover = in_lover;
    36. }
    37. private:
    38. // 姓名  可读可写
    39.     string name;
    40.     // 年龄        可读可写
    41.     int age = 0;
    42.     // 情人        只写
    43.     string lover;
    44. };
    45. int main()
    46. {
    47.     class person p1;
    48.     p1.set_name("张三");
    49.     cout<<"姓名为: "<get_name()<
    50.     p1.set_age(200);
    51.     cout<<"年龄为: "<get_age()<
    52.     p1.set_lover("鞠婧祎");
    53. return 0;
    54. }

    运行结果:

    四、封装案例

    案例1:设计立方体

    设计立方体类(Cube)

    求出立方体的面积和体积

    分别用全局函数和成员函数判断两个立方体是否相等。

    示例:

    1. #include
    2. #include
    3. using namespace std;
    4. /*
    5. 1.创建立方体类
    6. 2.设计属性
    7. 3.设计行为  获取立方体面积和体积
    8. 4.分别利用全局函数和成员函数  判断两个立方体是否相等
    9. */
    10. // 立方体类
    11. class Cube{
    12. public:
    13. void setL(int L)
    14. {
    15. m_L=L;
    16. }
    17. int getL()
    18. {
    19. return m_L;
    20. }
    21. void setW(int W)
    22. {
    23. m_W=W;
    24. }
    25. int getW()
    26. {
    27. return m_W;
    28. }
    29. void setH(int H)
    30. {
    31. m_H=H;
    32. }
    33. int getH()
    34. {
    35. return m_H;
    36. }
    37.     // 获取立方体的面积
    38.     int calculateS()
    39.     {
    40.     return 2*(m_L*m_W+m_W*m_H+m_L*m_H);
    41.     }
    42.     // 获取立方体的体积
    43.     int calculateV()
    44.     {
    45.         return m_L*m_H*m_W;
    46.     }
    47.    
    48. // 利用成员函数判断两个立方体是否相等
    49. bool isSameByClass(Cube &C)
    50. {
    51. if(m_L==C.getL()&&m_W==C.getW()&&m_H==C.getH()){
    52. return true;
    53. }
    54. return false;
    55. }
    56. private:
    57. int m_L;// 长
    58. int m_W;// 宽
    59. int m_H;// 高
    60. };
    61. // 利用全局函数判断  两个立方体是否相等
    62. bool isSame(Cube &C1,Cube &C2)
    63. {
    64. if(C1.getL()==C2.getL()&&C1.getW()==C2.getW()&&C1.getH()==C2.getH()){
    65. return true;
    66. }
    67. return false;
    68. }
    69. int main()
    70. {
    71. // 创建一个立方体对象
    72. class Cube C1;
    73. C1.setL(10);
    74. C1.setW(10);
    75. C1.setH(10);
    76. cout<<"C1的面积为:"<calculateS()<
    77. cout<<"C1的体积为:"<calculateV()<
    78. // 创建第二个立方体
    79. class Cube C2;
    80. C2.setL(10);
    81. C2.setW(20);
    82. C2.setH(10);
    83. // 全局函数判断
    84. bool ret=isSame(C1,C2);
    85. if(ret){
    86. cout<<"C1和C2是相等的"<
    87. }
    88. else{
    89. cout<<"C1和C2是不相等的"<
    90. }
    91. // 成员函数判断
    92. ret=C1.isSameByClass(C2);
    93. if(ret){
    94. cout<<"成员函数判断:C1和C2是相等的"<
    95. }
    96. else{
    97. cout<<"成员函数判断:C1和C2是不相等的"<
    98. }
    99. return 0;
    100. }

    运行结果:

    案例2:点和圆的关系

    设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。

    示例:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. // 判断点和圆的关系
    6. /*
    7. 点到圆心的距离== 半径  点在圆上
    8. 点到圆心的距离 > 半径  点在圆外
    9. 点到圆心的距离 < 半径  点在圆内
    10. */
    11. class Point
    12. {
    13. public:
    14. void setX(int X)
    15. {
    16. m_X=X;
    17. }
    18. int getX()
    19. {
    20. return m_X;
    21. }
    22. void setY(int Y)
    23. {
    24. m_Y=Y;
    25. }
    26. int getY()
    27. {
    28. return m_Y;
    29. }
    30. private:
    31. int m_X;
    32. int m_Y;
    33. };
    34. class Circle
    35. {
    36. public:
    37. // 设置半径
    38. void setR(int R)
    39. {
    40. m_R=R;
    41. }
    42. int getR()
    43. {
    44. return m_R;
    45. }
    46. // 设置圆心
    47. void setCenter(Point center)
    48. {
    49. m_Center=center;
    50. }
    51. Point getCenter()
    52. {
    53. return m_Center;
    54. }
    55. private:
    56. int m_R;  // 半径
    57. class Point m_Center;
    58. };
    59. // 判断点和圆的关系
    60. void isInCircle(Circle &c,Point &p)
    61. {
    62. // 计算两点间距离
    63. int distance=pow((pow(c.getCenter().getX()-p.getX(),2))+(pow(c.getCenter().getY()- p.getY(),2)),0.5);
    64. if(distance==c.getR()){
    65. cout<<"点在圆上"<
    66. }else if(distance > c.getR()){
    67. cout<<"点在圆外"<
    68. }else{
    69. cout<<"点在圆内"<
    70. }
    71. }
    72. int main()
    73. {
    74. // 创建一个圆  和一个圆心  的对象
    75. Circle c;
    76. c.setR(10);
    77. Point center;
    78. center.setX(10);
    79. center.setY(0);
    80. c.setCenter(center);
    81. // 创建一个点
    82. Point P;
    83. P.setX(10);
    84. P.setY(9);
    85. // 全局函数判断点和圆的位置关系
    86. isInCircle(c,P);
    87. return 0;
    88. }

    运行结果:

  • 相关阅读:
    Redis常用数据结构操作与底层原理
    解读OpenShift的逻辑架构和技术架构
    Java中的自定义异常
    3D-2D PNP
    MySQL 从一个表中查出数据并插入到另一个表处理方案(详细)
    2022-vue实现-“对象数组“-模糊搜索功能
    layui laydate 提示“日期格式不正确”
    Web3D虚拟人制作简明指南
    动态数据渲染订单查询实现
    Java 类之 java.lang.reflect.Method
  • 原文地址:https://blog.csdn.net/hjl011006/article/details/132915055