当前位置:   article > 正文

C++中的 封装_c++封装

c++封装

目录

1 封装

1.1 封装的意义

1.2 语法

1.3 示例

1.3.1 示例1

1.3.2 示例2

1.4 将属性和行为加以权限控制

1.5 struct与class的区别

1.5.1 示例

1.6 成员属性设置为私有

1.7 示例

1.7.1 示例1

1.7.2 示例2


1 封装

1.1 封装的意义

封装是C++面向对象三大特性之一

1.2 语法

  1.  class name
  2.  {
  3.  访问权限:
  4.  ​
  5.          属性
  6.  ​
  7.          行为
  8.  };

注意:类中的属性和行为 统称为成员

  • 属性 又称 成员属性 / 成员变量

  • 行为 又称 成员函数 / 成员方法

封装将属性和行为作为一个整体,表现生活中的事物


1.3 示例

1.3.1 示例1

接下来创建一个圆类,以计算圆的周长

创建圆类:

  1. // 创建一个 圆 类,class后跟着的就是类的名称
  2.  class Circle
  3.  {
  4.      // 访问权限
  5.  public:// 公共权限
  6.  ​
  7.      // 属性
  8.      int r; // 半径
  9.  ​
  10.      // 行为
  11.      double caculate_perimeter() // 计算圆的周长
  12.     {
  13.          return 2 * PI * r;
  14.     }
  15.  };

主函数

实例化:通过类创建一个对象的过程

  1.  #define PI 3.14
  2.  int main()
  3.  {    //   实例化:通过类创建一个对象的过程
  4.      Circle c; // 通过 圆 类创建具体的圆(对象)
  5.  ​
  6.      cin >> c.r; // 给 圆 对象 的属性赋值
  7.  ​
  8.      cout << "半径为" << c.r << "的圆的周长为" << c.caculate_perimeter() << endl;
  9.      return 0;
  10.  }

img

1.3.2 示例2

设计一个学生类,属性有姓名和学号,行为可以给学生姓名和学号赋值,而且可以显示学生姓名和学号

  1. class student
  2.  {
  3.  public:
  4.  ​
  5.      // 属性:姓名 学号
  6.      string s_name;
  7.      int s_number;
  8.  ​
  9.      // 行为:给姓名与学号赋值/显示
  10.      void show()
  11.     {
  12.          cout << "学生姓名为" << s_name << endl;
  13.          cout << "学生学号为" << s_number;
  14.     }
  15.      // 赋值
  16.      void assignment1() // 键盘输入
  17.     {
  18.          cout << "请输入姓名" << endl;
  19.          cin >> s_name;
  20.          cout << endl;
  21.          cout << "请输入学号" << endl;
  22.          cin >> s_number;
  23.     }
  24.      void assignment2(string name,int Studnet_number)// 直接传参
  25.     {
  26.          s_name = name;
  27.          s_number = Studnet_number;
  28.     }
  29.  };

对于给姓名和学号赋值,有2种方法

  • 直接键盘cin

  • 调用函数时直接传参

方法不同,调用函数时写法也不同

  1.  int main()
  2.  {
  3.      student s1;
  4.      s1.assignment1();   //1键盘cin输入
  5.      s1.assignment2("joyce", 32054123); // 2直接传参
  6.      s1.show();
  7.  ​
  8.      return 0;
  9.  }

1.4 将属性和行为加以权限控制

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

访问权限有3种:

名称作用范围不同点
public公共权限类内可以访问,类外可以访问\
protected保护权限类内可以访问,类外不可以访问继承关系中,子可以使用父的
private私有权限类内可以访问,类外不可以访问继承关系中,子不能使用父的

示例:

  1.  class person
  2.  {
  3.  public:
  4.      string name;// 姓名,公共权限
  5.  ​
  6.  protected:
  7.      string car;// 汽车,保护权限
  8.  ​
  9.  private:
  10.      int password;// 密码,私有权限
  11.  };
  12.  ​
  13.  int main()
  14.  {
  15.      person p;
  16.      p.name = "joyce";// 只有公共权限在类外才可以访问
  17.      p.car = "BMW";
  18.      p.password = 131221;
  19.      return 0;
  20.  }

img

不过,如果在类内定义一个公共权限的函数,以访问各个权限的属性,则

  1.  class person
  2.  {
  3.  public:
  4.      string name;// 姓名,公共权限
  5.  ​
  6.  protected:
  7.      string car;// 汽车,保护权限
  8.  ​
  9.  private:
  10.      int password;// 密码,私有权限
  11.  ​
  12.  public: //类内定义的公共权限的函数
  13.      void func()
  14.     {
  15.          string name = "nana";
  16.          string car = "BMW";
  17.          int password = 19931312;
  18.     }
  19.  };

在main函数中调用func函数,则可以访问保护权限和私有权限的属性

     p.func();

不过若是将函数的权限从public改为protected或是private,则仍然无法访问

1.5 struct与class的区别

区别在于 默认的访问权限不同

名称默认访问权限
structpublic公共权限
classprivate私有权限

1.5.1 示例

创建struct和class两个类型

  1.  struct P1
  2.  {
  3.      int a;
  4.  };
  5.  class P2
  6.  {
  7.      int a;
  8.  };
  9. 在main函数中
创建变量并尝试访问
  1.  int main()
  2.  {
  3.      P1 p1; // 结构体
  4.      p1.a = 5;
  5.  ​
  6.      P2 p2; // 类
  7.      p2.a = 5;
  8.      return 0;
  9.  }

img

1.6 成员属性设置为私有

作用:

  • 可以自己控制成员的读写权限

  1.  class My
  2.  {
  3.  public:
  4.      void setname(string name)// 设置姓名
  5.     {
  6.          m_name = name;
  7.     }
  8.      string getname() // 返回姓名
  9.     {
  10.          return m_name;
  11.     }
  12.  ​
  13.      int getage() // 返回年龄,无法修改
  14.     {
  15.          return age;
  16.     }
  17.  ​
  18.      void setPassword(int password) // 修改密码,无法查看
  19.     {
  20.          m_Password = password;
  21.     }
  22.  private:
  23.      string m_name; // 设置为可读可写
  24.      int age = 5; // 设置为只读
  25.      int m_Password; // 设置为只写
  26.  };

接下来使用各个函数,修改或查看各个属性

  1. int main()
  2.  {
  3.      My m;
  4.      m.setname("joyce"); // 设置姓名
  5.      cout << m.getname() << endl; // 查看姓名
  6.  ​
  7.      cout << m.getage() << endl;// 查看年龄
  8.      //m.age = 6; // 若想修改年龄,无法访问
  9.  ​
  10.      m.setPassword(3171321); // 修改密码,无法查看
  11.      m.m_Password;
  12.  ​
  13.      return 0;
  14.  }

img

img

可读可写权限的姓名,可以修改或是查看

img

  • 对于写可以检测数据的有效性

在上面类中,我们在查看年龄getage函数下,加上设置年龄setage函数

  1.      void setage(int age) // 设置年龄,范围0-150
  2.     {
  3.          if (age < 0 || age>150)
  4.         {
  5.              cout << "Input errot!" << endl;
  6.              m_age = 0;
  7.              return;
  8.         }
  9.          m_age = age;
  10.     }

加以判断,若年龄不在0-150,则报错,满足才修改年龄

1.7 示例

1.7.1 示例1

设计一个正方体类,获取正方体长宽高,计算出正方体面积和体积,并分别用全局函数和成员函数判断两个立方体是否相等

  1.  class Cube
  2.  {
  3.  public:
  4.      // 设置与获取长宽高
  5.      void setCube(int L, int W, int H)
  6.     {
  7.          m_L = L;
  8.          m_W = W;
  9.          m_H = H;
  10.     }
  11.      int getL()
  12.     {
  13.          return m_L;
  14.     }
  15.      int getW()
  16.     {
  17.          return m_W;
  18.     }
  19.      int getH()
  20.     {
  21.          return m_H;
  22.     }
  23.      // 获取正方体面积
  24.      int calculateArea()
  25.     {
  26.          return 2 * (m_L * m_W + m_L * m_H + m_W * m_H);
  27.     }
  28.      // 获取正方体体积
  29.      int calculateVolume()
  30.     {
  31.          return m_L * m_W * m_H;
  32.     }
  33.      //2、用成员函数判断2个Cube是否相等
  34.      bool Judge2(Cube& cube)
  35.     {
  36.          if (getH() == cube.getH() &&
  37.              getL() == cube.getL() &&
  38.              getW() == cube.getW())
  39.              return true;
  40.          return false;
  41.     }
  42.  private:
  43.      int m_L, m_W, m_H;
  44.  };
  45.  ​
  46.  // 1、用全局函数判断2个Cube是否相等
  47.  bool Judge1(Cube&cube1 ,Cube&cube2)
  48.  {
  49.      if (cube1.getH() == cube2.getH() &&
  50.          cube1.getL() == cube2.getL() &&
  51.          cube1.getW() == cube2.getW())
  52.          return true;
  53.      return false;
  54.  }
  1.  int main()
  2.  {
  3.      // 创建第一个Cube
  4.      Cube cube1;
  5.      cube1.setCube(10,10,10);
  6.      /*cout << "正方体面积为" << cube1.calculateArea() << endl;
  7.      cout << "正方体体积为" << cube1.calculateVolume() << endl*/;
  8.  ​
  9.      // 创建第二个Cube
  10.      Cube cube2;
  11.      cube2.setCube(10, 10, 10);
  12.  ​
  13.      bool ret1 = Judge1(cube1,cube2); // 全局变量调用的对比
  14.      if (ret1)
  15.          cout << "cube1和cube2相等" << endl;
  16.      else
  17.          cout << "cube1和cube2不相等" << endl;
  18.  ​
  19.      bool ret2 = cube1.Judge2(cube2); // 成员函数调用的对比
  20.      if (ret2)    
  21.          cout << "cube1和cube2相等" << endl;
  22.      else
  23.          cout << "cube1和cube2不相等" << endl;
  24.      return 0;
  25.  }

img

两函数都相等

img

两函数都不相等

1.7.2 示例2

设计一个圆类和点类,属性包括圆和点的横坐标x和纵坐标y以及两点之间距离和圆的半径,并判断点在圆的什么位置(上、内、外)

点类:point.h头文件

  1.  class point // 点 类
  2.  {
  3.  public:
  4.      void setx(int x); // 设置点的横坐标x
  5.  ​
  6.      int getx();
  7.  ​
  8.      void sety(int y);// 设置点的纵坐标y
  9.  ​
  10.      int gety();
  11.  ​
  12.  private:
  13.      int p_x;
  14.      int p_y;
  15.  };

源文件:point.cpp

  1.  void point::setx(int x) // 设置点的横坐标x
  2.  {
  3.      p_x = x;
  4.  }
  5.  int point::getx()
  6.  {
  7.      return p_x;
  8.  }
  9.  void point::sety(int y) // 设置点的纵坐标y
  10.  {
  11.      p_y = y;
  12.  }
  13.  int point::gety()
  14.  {
  15.      return p_y;
  16.  }

注意:在各个头文件中原来的各个函数都是全局函数,但每个函数都是成员函数,因此要加上它自己作用域下的函数point::/circle::

圆类:头文件:circle.h

  1.  class circle // 设置 圆 类
  2.  {
  3.  public:
  4.      void setr(int r); // 设置半径
  5.  ​
  6.          int getr();
  7.  ​
  8.          void setCenter(point center); // 设置圆心,本质也是个半径
  9.  ​
  10.          point getCenter();
  11.  ​
  12.  private:
  13.      int c_r;
  14.      point c_center;// 一个类中可以包含另一个类,作为原来类的成员
  15.  };

源文件:circle.cpp

  1.  void circle::setr(int r) // 设置半径
  2.  {
  3.      c_r = r;
  4.  }
  5.  int circle::getr()
  6.  {
  7.      return c_r;
  8.  }
  9.  void circle::setCenter(point center) // 设置圆心,本质也是个半径
  10.  {
  11.      c_center = center;
  12.  }
  13.  point circle::getCenter()
  14.  {
  15.      return c_center;
  16.  }

计算距离、半径平方以及判断

  1.  void IsInCircle(circle &c,point &p) // 判断两点之间关系
  2.  {
  3.      // 计算两点之间距离
  4.      int distance=
  5.     (c.getCenter().getx() - p.getx()) * (c.getCenter().getx() - p.getx()) +
  6.     (c.getCenter().gety() - p.gety()) * (c.getCenter().gety() - p.gety());
  7.  ​
  8.      // 计算半径的平方
  9.      int square = c.getr() * c.getr();
  10.  ​
  11.      // 判断距离和平方的关系
  12.      if       (distance == square)
  13.          cout << "在圆上" << endl;
  14.      else if (distance > square)
  15.          cout << "在圆外" << endl;
  16.      else
  17.          cout << "在圆内" << endl;
  18.  }

main函数

  1.  int main()
  2.  {
  3.      // 创建圆
  4.      circle c;
  5.      c.setr(1);
  6.      point center;
  7.      center.setx(2);
  8.      center.sety(2);
  9.      c.setCenter(center);
  10.  ​
  11.      // 创建点
  12.      point p;
  13.      p.setx(2);
  14.      p.sety(1);
  15.  ​
  16.      IsInCircle(c, p);
  17.  ​
  18.      return 0;
  19.  }

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

闽ICP备14008679号