当前位置:   article > 正文

C++类和对象--封装,类分文件编写_实现一个类如何设置头文件封装

实现一个类如何设置头文件封装

目录

 1.封装

1.1封装的意义一--将属性和行为作为一个整体

 1.1.1成员属性,成员变量,成员函数,成员方法

 1.2封装的意义二--将属性和行为加以控制,公共权限,保护权限,私有权限

1.3struct和class区别

1.4成员属性设置为私有的优点

 1.4.1可以自己控制读写权限

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

1.5案例练习

1.5.1练习1--设计立方体

1.5.2练习二--点和圆的关系

1.5.2.1在类中可以让另一个类作为本类的成员

1.5.2.2如何把一个类拆到不同的文件中.h,.cpp


 1.封装

1.1封装的意义一--将属性和行为作为一个整体

  1. #include<iostream>
  2. using namespace std;
  3. const double PI = 3.14;
  4. //设计圆类,求圆的周长
  5. //圆求周长的公式:2*PI*半径
  6. //class达标设计一个类,类后面紧跟着的就是类名
  7. class Circle
  8. {
  9. //访问权限
  10. //公共权限,不管是在类内还是类外都可以访问
  11. public:
  12. //属性,通常是一些变量
  13. int m_r;//半径
  14. //行为,在代码中通常用函数去代表它
  15. //获取圆的周长
  16. double calculateZC()
  17. {
  18. return 2 * PI * m_r;
  19. }
  20. };
  21. int main()
  22. {
  23. //通过圆类 创建具体的圆,具体的圆我们称为对象
  24. //实例化(通过一个类 创建一个对象的过程称为实例化)
  25. Circle c1;
  26. //给圆对象的属性进行赋值
  27. c1.m_r = 10;
  28. cout << "圆的周长为:" << c1.calculateZC() << endl;
  29. //将半径和求周长封装在一起
  30. system("pause");//按任意键继续
  31. return 0;
  32. }

 1.1.1成员属性,成员变量,成员函数,成员方法

  1. #include<iostream>
  2. using namespace std;
  3. const double PI = 3.14;
  4. //设计学生类
  5. class Student
  6. {
  7. //类中的属性和行为 我们统一称为 成员
  8. //属性也称为成员属性,成员变量
  9. //行为也称为成员函数 成员方法
  10. //公共权限
  11. public:
  12. //属性,通常是一些变量
  13. string name;
  14. int number;
  15. //行为,在代码中通常用函数去代表它
  16. //显示姓名和学号
  17. void showStudent()
  18. {
  19. cout <<"姓名:"<< name << " "
  20. <<"学号:"<< number << endl;
  21. }
  22. //可以通过行为给属性赋值
  23. //给姓名赋值
  24. void setName(string m_name)
  25. {
  26. name = m_name;
  27. }
  28. //给学号赋值
  29. void setNumber(int m_number)
  30. {
  31. number = m_number;
  32. }
  33. };
  34. int main()
  35. {
  36. //创建一个具体学生 实例化(通过一个类 创建对象的过程)对象
  37. Student s;
  38. //给s对象 进行属性赋值操作
  39. s.name = "张三";
  40. s.number = 201640;
  41. s.showStudent();
  42. Student s1;
  43. s1.setName("李四");
  44. s1.setNumber(2017022);
  45. s1.showStudent();
  46. system("pause");//按任意键继续
  47. return 0;
  48. }

 1.2封装的意义二--将属性和行为加以控制,公共权限,保护权限,私有权限

  1. #include<iostream>
  2. using namespace std;
  3. //访问权限
  4. //公共权限 public 成员类内可以访问,类外也可以访问
  5. //保护权限 protected 成员类内可以访问,类外不可以访问 儿子可以访问父亲中的保护内容
  6. //私有权限 private 成员类内可以访问,类外不可以访问 儿子不可以访问父亲中的私有内容
  7. class person
  8. {
  9. //公共权限
  10. public:
  11. string m_Name;//姓名
  12. //保护权限
  13. protected:
  14. string m_Car;//汽车
  15. //私有权限
  16. private:
  17. int m_Password;//银行卡密码
  18. private:
  19. void func()
  20. {
  21. m_Name = "张三";
  22. m_Car = "拖拉机";
  23. m_Password = 123456;
  24. }
  25. };
  26. int main()
  27. {
  28. //实例化具体对象
  29. person p1;
  30. p1.m_Name = "李四";
  31. //p1.m_car = "奔驰";//保护权限的内容,在类外访问不到
  32. //p1.m_Password = 123;//私有权限的内容,在类外访问不到
  33. //p1.func();私有权限的内容,在类外访问不到
  34. system("pause");//按任意键继续
  35. return 0;
  36. }

1.3struct和class区别

  1. #include<iostream>
  2. using namespace std;
  3. class C1
  4. {
  5. //默认权限就是public啥的都没写
  6. int m_A;//默认权限是私有
  7. };
  8. struct C2
  9. {
  10. int m_A;//默认权限 是公告
  11. };
  12. int main()
  13. {
  14. //struct和class的区别
  15. //struct 默认权限是 公共 public
  16. //class 默认权限是 私有 private
  17. C1 c1;
  18. //c1.m_A = 100;//报错
  19. C2 c2;
  20. c2.m_A = 100;//在struct中默认权限为公共,可以访问
  21. system("pause");//按任意键继续
  22. return 0;
  23. }

1.4成员属性设置为私有的优点

 1.4.1可以自己控制读写权限

  1. #include<iostream>
  2. using namespace std;
  3. //成员属性设置为私有
  4. //1、可以控制读写权限
  5. //2、对于写可以检测数据的有效性
  6. class Person
  7. {
  8. public:
  9. //设置姓名
  10. void setName(string name)
  11. {
  12. m_Name = name;//对外提供一个公共的成员函数,来侧面给它的成员属性进行赋值操作
  13. }
  14. //获取姓名
  15. string getName()
  16. {
  17. return m_Name;
  18. }
  19. //获取年龄,只读
  20. int getAge()
  21. {
  22. m_Age = 0;//初始化为0岁
  23. return m_Age;
  24. }
  25. //设置情人 只写
  26. void setLover(string lover)
  27. {
  28. m_Lover = lover;
  29. }
  30. private:
  31. //姓名 可读可写
  32. string m_Name;
  33. //年龄 只读
  34. int m_Age;
  35. //情人 只写
  36. string m_Lover;
  37. };
  38. int main()
  39. {
  40. Person p;
  41. p.setName("张三");
  42. cout << "姓名为:" << p.getName() << endl;
  43. //p.m_Age = 18;//只读
  44. //p.setAge(18);//只读
  45. cout << "年龄为:" << p.getAge() << endl;
  46. //设置情人为苍井女士
  47. p.setLover("苍井");
  48. //cout << "情人为:" << p.m_Lover << endl;
  49. //cout << "情人为:" << p.getLover() << endl;
  50. system("pause");//按任意键继续
  51. return 0;
  52. }

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

  1. #include<iostream>
  2. using namespace std;
  3. //成员属性设置为私有
  4. //1、可以控制读写权限
  5. //2、对于写可以检测数据的有效性
  6. class Person
  7. {
  8. public:
  9. //设置姓名
  10. void setName(string name)
  11. {
  12. m_Name = name;//对外提供一个公共的成员函数,来侧面给它的成员属性进行赋值操作
  13. }
  14. //获取姓名
  15. string getName()
  16. {
  17. return m_Name;
  18. }
  19. //获取年龄,可读可写,如果想修改(年龄的范围必须是0-150之间)
  20. int getAge()
  21. {
  22. return m_Age;
  23. }
  24. //设置年龄
  25. void setAge(int age)
  26. {
  27. if (age < 0 || age>150)
  28. {
  29. cout << "年龄有误" << endl;
  30. m_Age = 0;
  31. }
  32. else
  33. {
  34. m_Age = age;
  35. }
  36. /*还可以这样写
  37. if (age < 0 || age>150)
  38. {
  39. cout << "年龄有误" << endl;
  40. m_Age = 0;
  41. return;
  42. }
  43. m_Age = age;
  44. */
  45. }
  46. //设置情人 只写
  47. void setLover(string lover)
  48. {
  49. m_Lover = lover;
  50. }
  51. private:
  52. //姓名 可读可写
  53. string m_Name;
  54. //年龄 只读
  55. int m_Age;
  56. //情人 只写
  57. string m_Lover;
  58. };
  59. int main()
  60. {
  61. Person p;
  62. p.setName("张三");
  63. cout << "姓名为:" << p.getName() << endl;
  64. p.setAge(18);
  65. cout << "年龄为:" << p.getAge() << endl;
  66. //设置情人为苍井女士
  67. p.setLover("苍井");
  68. //cout << "情人为:" << p.m_Lover << endl;
  69. //cout << "情人为:" << p.getLover() << endl;
  70. system("pause");//按任意键继续
  71. return 0;
  72. }

1.5案例练习

1.5.1练习1--设计立方体

  1. #include<iostream>
  2. using namespace std;
  3. //立方体类
  4. class Cube
  5. {
  6. public:
  7. void setL(double l)//设置长
  8. {
  9. m_L = l;
  10. }
  11. double getL()//获取长
  12. {
  13. return m_L ;
  14. }
  15. void setW(double w)
  16. {
  17. m_W = w;
  18. }
  19. double getW()
  20. {
  21. return m_W;
  22. }
  23. void setH(double h)
  24. {
  25. m_H = h;
  26. }
  27. double getH()
  28. {
  29. return m_H;
  30. }
  31. double getS()//返回面积
  32. {
  33. return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_H * m_W;
  34. }
  35. double getV()//返回面积
  36. {
  37. return m_L * m_W * m_H;
  38. }
  39. //利用成员函数判断是否相等
  40. /*void judge(double l, double w, double h)
  41. {
  42. if (m_L == l && m_W == w && m_H == h)
  43. {
  44. cout << "相等" << endl;
  45. }
  46. else
  47. {
  48. cout << "不相等" << endl;
  49. }
  50. }*/
  51. bool isSamebyClass(Cube &c)//成员函数传一个就好,会用已知到去调用这个函数,传入一个未知的
  52. {
  53. if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH())
  54. {
  55. return true;
  56. }
  57. return false;
  58. }
  59. private:
  60. double m_L, m_W, m_H;
  61. };
  62. //利用全局函数判断是否相等
  63. /*void Qjudge(double a1, double a2, double a3, double b1, double b2, double b3)
  64. {
  65. if (a1 == b1 && a2 == b2 && a3 == b3)
  66. {
  67. cout << "相等" << endl;
  68. }
  69. else
  70. {
  71. cout << "不相等" << endl;
  72. }
  73. }*/
  74. bool isSame(Cube &c1, Cube &c2)//值传递会拷贝出来一份数据,引用传递不拷贝,会用原始的
  75. {
  76. if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
  77. {
  78. return true;
  79. }
  80. return false;
  81. }
  82. int main()
  83. {
  84. //创建立方体对象
  85. Cube c1, c2;
  86. c1.setL(10);
  87. c1.setW(10);
  88. c1.setH(10);
  89. c2.setL(20);
  90. c2.setW(20);
  91. c2.setH(20);
  92. cout << "c1面积" << c1.getS() << endl;
  93. cout << "c1体积:" << c1.getV() << endl;
  94. //利用成员函数判断
  95. //c1.judge(c2.getL(), c2.getW(), c2.getH());
  96. //利用全局函数判断
  97. //Qjudge(c1.getL(), c1.getW(), c1.getH(), c2.getL(), c2.getW(), c2.getH());
  98. //利用全局函数判断
  99. bool ret = isSame(c1, c2);
  100. if (ret)
  101. {
  102. cout << "c1、c2相等" << endl;
  103. }
  104. else
  105. {
  106. cout << "c1、c2不相等" << endl;
  107. }
  108. //利用成员函数判断
  109. bool ret1 = c1.isSamebyClass(c2);
  110. if (ret1)
  111. {
  112. cout << "c1、c2相等" << endl;
  113. }
  114. else
  115. {
  116. cout << "c1、c2不相等" << endl;
  117. }
  118. system("pause");//按任意键继续
  119. return 0;
  120. }

1.5.2练习二--点和圆的关系

1.5.2.1在类中可以让另一个类作为本类的成员

  1. #include<iostream>
  2. using namespace std;
  3. //点类
  4. class Point
  5. {
  6. public:
  7. //设置x
  8. void setX(double x)
  9. {
  10. m_X = x;
  11. }
  12. //获取x
  13. double getX()
  14. {
  15. return m_X;
  16. }
  17. //设置y
  18. void setY(double y)
  19. {
  20. m_Y = y;
  21. }
  22. //获取y
  23. double getY()
  24. {
  25. return m_Y;
  26. }
  27. private:
  28. double m_X;
  29. double m_Y;
  30. };
  31. //圆类
  32. class Circle
  33. {
  34. public:
  35. //设置半径
  36. void setR(double r)
  37. {
  38. m_R = r;
  39. }
  40. //获取半径
  41. double getR()
  42. {
  43. return m_R;
  44. }
  45. //设置圆心
  46. void setC(Point center)
  47. {
  48. m_Center = center;
  49. }
  50. //获取圆心
  51. Point getC()
  52. {
  53. return m_Center;
  54. }
  55. private:
  56. double m_R;
  57. //在类中可以让另一个类 作为本类中的成员
  58. Point m_Center;
  59. };
  60. //判断点和圆之间的位置关系
  61. void isInCircle(Circle &c, Point &p)
  62. {
  63. //计算两点之间距离的平方
  64. double distance= (p.getX() - c.getC().getX())* (p.getX() - c.getC().getX())
  65. + (p.getY() - c.getC().getY()) * (p.getY() - c.getC().getY());
  66. //计算半径的平方
  67. double rDistance= c.getR() * c.getR();
  68. if (distance == rDistance)
  69. {
  70. cout << "点在圆上" << endl;
  71. }
  72. else if (distance > rDistance)
  73. {
  74. cout << "点在圆外" << endl;
  75. }
  76. else
  77. {
  78. cout << "点在圆内" << endl;
  79. }
  80. }
  81. int main()
  82. {
  83. //创建圆
  84. Circle c;
  85. c.setR(10);
  86. Point cp;
  87. cp.setX(10);
  88. cp.setY(0);
  89. c.setC(cp);
  90. //创建点
  91. Point p1,p2,p3;
  92. p1.setX(10);
  93. p1.setY(9);
  94. p2.setX(10);
  95. p2.setY(10);
  96. p3.setX(10);
  97. p3.setY(11);
  98. isInCircle(c, p1);
  99. isInCircle(c, p2);
  100. isInCircle(c, p3);
  101. system("pause");//按任意键继续
  102. return 0;
  103. }

1.5.2.2如何把一个类拆到不同的文件中.h,.cpp

 

 

  1. /*point.h代码
  2. #pragma once//防止头文件重复包含
  3. //在头文件中声明
  4. #include<iostream>
  5. using namespace std;
  6. //把成员函数和属性声明
  7. class Point
  8. {
  9. public:
  10. void setX(double x);
  11. //获取x
  12. double getX();
  13. //设置y
  14. void setY(double y);
  15. //获取y
  16. double getY();
  17. private:
  18. double m_X;
  19. double m_Y;
  20. };
  21. */
  22. /*c.h代码
  23. #pragma once//防止头文件重复包含
  24. #include<iostream>
  25. using namespace std;
  26. #include"point.h"
  27. class Circle
  28. {
  29. public:
  30. //设置半径
  31. void setR(double r);
  32. //获取半径
  33. double getR();
  34. //设置圆心
  35. void setC(Point center);
  36. //获取圆心
  37. Point getC();//将point头文件加进来,让它知道有这么一个类
  38. private:
  39. double m_R;
  40. //在类中可以让另一个类 作为本类中的成员
  41. Point m_Center;
  42. };
  43. */
  44. /*circle.cpp代码
  45. #include"c.h"
  46. //在头文件中写声明,在cpp中写实现
  47. //设置半径
  48. void Circle::setR(double r)
  49. {
  50. m_R = r;
  51. }
  52. //获取半径
  53. double Circle::getR()
  54. {
  55. return m_R;
  56. }
  57. //设置圆心
  58. void Circle::setC(Point center)
  59. {
  60. m_Center = center;
  61. }
  62. //获取圆心
  63. Point Circle::getC()
  64. {
  65. return m_Center;
  66. }
  67. */
  68. /*P.cpp代码
  69. #include"point.h"
  70. //只需要留函数的所有实现
  71. //如果只写setX他是全局函数,
  72. // 但我们知道它是一个成员函数
  73. // 需要告诉他是哪个作用域下的
  74. //设置x
  75. void Point::setX(double x)//Point作用域下的成员函数
  76. {
  77. m_X = x;
  78. }
  79. //获取x
  80. double Point::getX()
  81. {
  82. return m_X;
  83. }
  84. //设置y
  85. void Point::setY(double y)
  86. {
  87. m_Y = y;
  88. }
  89. //获取y
  90. double Point::getY()
  91. {
  92. return m_Y;
  93. }
  94. */
  95. #include<iostream>
  96. using namespace std;
  97. #include"point.h"
  98. #include"c.h"
  99. //判断点和圆之间的位置关系
  100. void isInCircle(Circle &c, Point &p)
  101. {
  102. //计算两点之间距离的平方
  103. double distance= (p.getX() - c.getC().getX())* (p.getX() - c.getC().getX())
  104. + (p.getY() - c.getC().getY()) * (p.getY() - c.getC().getY());
  105. //计算半径的平方
  106. double rDistance= c.getR() * c.getR();
  107. if (distance == rDistance)
  108. {
  109. cout << "点在圆上" << endl;
  110. }
  111. else if (distance > rDistance)
  112. {
  113. cout << "点在圆外" << endl;
  114. }
  115. else
  116. {
  117. cout << "点在圆内" << endl;
  118. }
  119. }
  120. int main()
  121. {
  122. //创建圆
  123. Circle c;
  124. c.setR(10);
  125. Point cp;
  126. cp.setX(10);
  127. cp.setY(0);
  128. c.setC(cp);
  129. //创建点
  130. Point p1,p2,p3;
  131. p1.setX(10);
  132. p1.setY(9);
  133. p2.setX(10);
  134. p2.setY(10);
  135. p3.setX(10);
  136. p3.setY(11);
  137. isInCircle(c, p1);
  138. isInCircle(c, p2);
  139. isInCircle(c, p3);
  140. system("pause");//按任意键继续
  141. return 0;
  142. }

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

闽ICP备14008679号