• C++学习:类与对象


    一、分类的思想

    物以类聚,人以群分,在生活中,我们习惯将事物进行分类,在程序设计中也是可以引入分类的思想。

    中国的12生肖可以将人分成不同的类型;

    外国的12星座也是将人分成不同的类型;

    按照财富的多少分高产、中产、低产,也是将人进行分类;

    官员的九品等级也是将官员进行分类;

    老虎也分为东北虎、华南虎,孟加拉虎等;

    二、面向对象的意义

    将日常生活中的思维习惯引入到程序设计中;

    将需求中的概念直观的映射到解决方案中;

    以模块为中心构建可复用的软件系统;

    提高软件产品的可维护性和可扩展性;

    三、类与对象

    类:指的是一类事物,是一个抽象的概念,比如高产、中产、低产;

    对象:指的是某个类的具体实体,比如笔者就是低产这类人中的一个对象;

    一个类又可以分成多个小类,比如人类是一个类,人类可以分成黄种人、白种人、黑种人等小类,黄种人还可以继续分类,如中国人、韩国人、日本人等。

    把事物分类就是为了方便区分,分类一般是按照属性和行为来分的。

    四、类之间的基本关系(继承与组合)

    继承

    从已存在的类中细分出来的类与原类之间具有继承关系

    继承的类,也叫做子类,拥有原类,也叫做父类的所有属性和行为;

    如东北虎是从老虎这个类中细分出来的,东北虎具有老虎的所有属性和行为;

    组合

    一些类的存在依赖于其他的类,这种关系叫组合;

    组合的类在某个局部行由其他的类组成;

    比如电脑这个类,是由内存、主板、显示器、硬盘等东哥类组成的;

    五、类的表示方法

    1、汉字描述法

    生物类(可细分成动物类和植物类)

            生物类的属:有生命

    动物类(继承于生物类类)

            动物类的属性:有生命,可移动

            动物类的行为:找事物

    植物类(继承于生物类类)

            植物类的属性:有生命,可生长

    人类(继承于动物类)

            人类的属性:有生命,可移动

            人类的行为:找食物、睡觉、劳动

    禽兽类(继承于动物类)

            禽兽类的属性:有生命、可移动

            禽兽类的行为:找食物、睡觉

    2、汉字+符号表示法

    1. 类:生物{
    2. 属性:有生命
    3. }
    4. 类:动物继承生物{
    5. 属性:可移动
    6. 行为:找食物
    7. }
    8. 类:植物继承生物{
    9. 属性:可生长
    10. }
    11. 类:禽兽继承动物{
    12. 行为:睡觉
    13. }
    14. 类:人类继承动物{
    15. 行为:睡觉
    16. 行为:劳动
    17. }

    3、汉字+符号+单词表示法

    1. struct 生物{
    2. 属性:有生命
    3. }
    4. struct 动物:生物{
    5. 属性:可移动
    6. 行为:找食物
    7. }
    8. struct 植物:生物{
    9. 属性:可生长
    10. }
    11. struct 禽兽:动物{
    12. 行为:睡觉
    13. }
    14. struct 人类:动物{
    15. 行为:睡觉
    16. 行为:劳动
    17. }

    4、C++语言表示法

    1. struct Biology
    2. {
    3. bool living;
    4. };
    5. struct Animal :Biology
    6. {
    7. bool movable;
    8. void findFood()
    9. {
    10. printf("I need food!\n");
    11. }
    12. };
    13. struct Plant :Biology
    14. {
    15. bool growable;
    16. };
    17. struct Beast :Animal
    18. {
    19. void sleep()
    20. {
    21. printf("I need sleep!\n");
    22. }
    23. };
    24. struct Human :Animal
    25. {
    26. void sleep()
    27. {
    28. printf("I need sleep!\n");
    29. }
    30. void work()
    31. {
    32. printf("I need work!\n");
    33. }
    34. };

    六、类与封装

    当实用类的时候,不需要关心类的使用细节;

    只有在创建类的时候,才需要考虑内部的实现细节;

    所谓封装就是将类的实现细节封起来。

    C++中类的封装有哪些内容

    1、成员变量:用于表示类属性的变量

    2、成员函数:用于表示类行为的函数

    3、成员变量和成员函数的访问级别

    C++中成员变量和成员函数的访问级别

    public:成员变量和成员函数可以在类的内部和外界访问;

    private:成员变量和成员函数只能在类的内部被访问;

    比如:

    一个女生的外貌就是公开的,自己和别人都看得到,这就是public;

    但是女生的年龄别人是看不见的,只有自己知道,这就是private;

    要想知道这个女生的年龄,那就得让这个女生自己告诉你才行。

    程序实例1:公有属性(public)和私有属性(private)的访问

    1. #include
    2. struct Biology
    3. {
    4. bool living;
    5. };
    6. struct Animal :Biology
    7. {
    8. bool movable;
    9. void findFood()
    10. {
    11. printf("I need food!\n");
    12. }
    13. };
    14. struct Plant :Biology
    15. {
    16. bool growable;
    17. };
    18. struct Beast :Animal
    19. {
    20. void sleep()
    21. {
    22. printf("I need sleep!\n");
    23. }
    24. };
    25. struct Human :Animal
    26. {
    27. void sleep()
    28. {
    29. printf("I need sleep!\n");
    30. }
    31. void work()
    32. {
    33. printf("I need work!\n");
    34. }
    35. };
    36. struct Girl :Human
    37. {
    38. private: //私有属性
    39. int age;
    40. int weight;
    41. public://公有属性
    42. void print()
    43. {
    44. age = 22;
    45. weight = 48;
    46. printf("I'm %d years old.\n",age);
    47. printf("My weight is %d.\n", weight);
    48. }
    49. };
    50. struct Boy :Human
    51. {
    52. private://私有属性
    53. int height;
    54. int salary;
    55. public://公有属性
    56. int age;
    57. int weight;
    58. void print()
    59. {
    60. height = 175;
    61. salary = 10000;
    62. printf("My height is %d.\n", height);
    63. printf("My salary is %d.\n", salary);
    64. }
    65. };
    66. int main()
    67. {
    68. Girl g;//创建一个对象g,跟定义一个变量差不多
    69. Boy b;//创建一个对象b
    70. //g.age = 20; //不能直接给g.age赋值,因为女孩的年龄是私有变量,不对外公开
    71. g.print();//可以通过询问女孩,让女孩自己告诉你
    72. b.age = 30; //可以给b.age赋值,因为男生的年龄是公有变量
    73. b.print();//询问男孩的身高和收入
    74. return 0;
    75. }

    输出结果:

    1. I'm 22 years old.
    2. My weight is 48.
    3. My height is 175.
    4. My salary is 10000.

    七、类的成员作用域

    类成员(包括成员变量和成员函数)的作用域都是在类的内部,外部无法直接访问;

    类的成员函数可以直接访问成员变量和调用成员函数;

    类的外部可以通过类变量(也就是对象)来访问public成员;

    类成员的作用域与访问级别没有关系;

    C++中用struct 定义的类,如果没有定义私有还是公有的属性,那么默认就是公有属性(public);

    程序实例2:类成员作用域

    1. #include
    2. int i = 1; //定义一个全局变量i
    3. struct Test
    4. {
    5. private:
    6. int i; //在类里面定义一个私有变量i
    7. public:
    8. int j;//在类里面定义一个公有变量j
    9. int getI()
    10. {
    11. i = 3;
    12. return i;
    13. }
    14. };
    15. int main()
    16. {
    17. int i = 2; //定义一个局部变量i
    18. Test test;
    19. test.j = 4;
    20. printf("i = %d\n", i);//打印局部变量i
    21. printf("::i = %d\n", ::i); //打印全局变量i
    22. //printf("test.i = %d\n",test.i); //类对象不能访问私有变量i
    23. printf("test.j = %d\n", test.j); //类对象可以访问公有变量j
    24. printf("test.getI() = %d\n", test.getI());//通过类成员函数访问类的私有变量
    25. return 0;
    26. }

    输出结果:

    1. i = 2
    2. ::i = 1
    3. test.j = 4
    4. test.getI() = 3

    八、类的真正形态

    struct在C语言中是表示结构体的,但是经过不断地改进已经越来越不像结构体了,既然已经变味了那就变得彻底一点吧。C++中有个新的关键字class,专门用来定义类。

    其实class关键字和struct关键字的用法基本是一样的,只有一点小差异:

    在用struct定义类时,所有成员的默认访问级别是public;

    在用class定义类时,所有成员的默认访问级别是private;

    1. struct A
    2. {
    3. int i; //默认是public
    4. int getI() //默认是public
    5. {
    6. return i;
    7. }
    8. };
    9. class B
    10. {
    11. int i; //默认是private
    12. int getI() //默认是private
    13. {
    14. return i;
    15. }
    16. };

    程序实例3:struct定义类与class定义类对比

    1. #include
    2. struct A
    3. {
    4. int i; //默认是public
    5. int getI() //默认是public
    6. {
    7. return i;
    8. }
    9. };
    10. class B
    11. {
    12. int i; //默认是private
    13. int getI() //默认是private
    14. {
    15. return i;
    16. }
    17. };
    18. int main()
    19. {
    20. A a;
    21. B b;
    22. a.i = 4;//struct定义的类默认的是公有变量,可以直接访问
    23. printf("a.getI() = %d\n",a.getI());
    24. //b.i = 5;//class定义的类默认的是私有变量,不能直接访问
    25. //printf("b.getI() = %d\n", b.getI());
    26. return 0;
    27. }

    九、开发一个四则运算的类

    提供setOperatior函数设置运算类型;

    提供setParameter函数设置运算参数;

    提供result函数进行运算:返回值表示运算的合法性,通过引用参数返回结果。

    C++的类支持声明和实现分开操作,将类的实现和定义分开:

    .h头文件中只有类的声明,包括成员变量和成员函数的声明;

    .cpp源文件中完成类中成员函数的具体实现;

    头文件Operator.h

    1. #pragma once
    2. class Operator
    3. {
    4. private:
    5. char mOp;
    6. double mP1;
    7. double mP2;
    8. public:
    9. bool setOperator(char op);
    10. void setParameter(double p1, double p2);
    11. bool result(double& r);
    12. };

    源文件Operator.cpp

    1. #include "Operator.h"
    2. bool Operator::setOperator(char op)
    3. {
    4. bool ret = false;
    5. if ((op == '+') || (op == '-') || (op == '*') || (op == '/'))
    6. {
    7. ret = true;
    8. mOp = op;
    9. }
    10. else
    11. {
    12. mOp = '\0';
    13. }
    14. return ret;
    15. }
    16. void Operator::setParameter(double p1, double p2)
    17. {
    18. mP1 = p1;
    19. mP2 = p2;
    20. }
    21. bool Operator::result(double& r)
    22. {
    23. bool ret = true;
    24. switch (mOp)
    25. {
    26. case '/':
    27. if ((-0.000000001 < mP2) && (mP2 < 0.000000001))
    28. {
    29. ret = false;
    30. }
    31. else
    32. {
    33. r = mP1 / mP2;
    34. }
    35. break;
    36. case '+':
    37. r = mP1 + mP2;
    38. break;
    39. case '-':
    40. r = mP1 - mP2;
    41. break;
    42. case '*':
    43. r = mP1 * mP2;
    44. break;
    45. default:
    46. ret = false;
    47. break;
    48. }
    49. return ret;
    50. }

    main函数中使用类

    1. #include
    2. #include "Operator.h"
    3. int main()
    4. {
    5. Operator op;
    6. double r = 0;
    7. op.setOperator('/');
    8. op.setParameter(5,3);
    9. if (op.result(r))
    10. {
    11. printf("r = %lf\n", r);
    12. }
    13. else
    14. {
    15. printf("calculate error\n");
    16. }
    17. return 0;
    18. }

  • 相关阅读:
    HarmonyOS NEXT应用开发之预加载so并读取RawFile文件
    N-FX3-4 删除链表节点
    Matlab提取excel数据及处理的实操举例
    Guava类库——Table详解
    C语言课程回顾:十、C语言之 指针
    【修复】centos定时任务python top不能输出
    Flutter/Dart 中的 extension 方法
    最全面的蓝桥杯常考知识点总结(Python)|冲国赛
    基于3D分层卷积融合的多模态生理信号情绪识别
    数据开发支持工具
  • 原文地址:https://blog.csdn.net/m0_49968063/article/details/133562268