1. 面向对象基本概念

(1)面向对象的意义在于

①将日常生活中习惯的思维方式引入程序设计中

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

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

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

(2)类和对象是面向对象中的两个基本概念

 

对象

概念

指的是一类事物,是一个抽象的概念

指的是属于某个类的具体实例

关系

类是一种模型,这种模型可以创建出不同的对象。一个类可以有很多对象。

对象实体是类模型的一个具体实例。一个对象必然属于某个类

意义

类用于抽象的描述一类事物所特有的属性和行为。如电脑拥有CPU、内存和硬盘,并县城可以开机和运行程序

对象是具体的事物,拥用所属类中描述的一切属性和行为。如每一只老虎都有不同的体重、不同的食量和不同的性情。

2.类之间的基本关系

(1)继承

①从已存在类细分出来的类和原类之间具有继承关系(is-a)

②继承的类(子类)拥有原类(父类)的所有属性和行为

(2)组合

①一些类的存在必须依赖于其它的类,这种关系叫组合

②组合的类在某一个局部上由其它的类组成

3.类的表示法

  1. #include <stdio.h>
  2.  
  3. struct Biology
  4. {
  5. bool living;
  6. };
  7.  
  8. struct Animal : Biology
  9. {
  10. bool movable;
  11. void findFood(){};
  12. };
  13.  
  14. struct Plant : Biology
  15. {
  16. bool growable;
  17. };
  18.  
  19. struct Beast : Animal
  20. {
  21. void sleep(){};
  22. };
  23.  
  24. struct Human : Animal
  25. {
  26. void sleep(){};
  27. void work(){};
  28. };
  29.  
  30. int main()
  31. {
  32. return ;
  33. }

4.类的封装

4.1.封装的基本概念

(1)类通常分为两个部分:类的实现细节、类的使用方式。当使用类时,不需要关心其实现细节。当创建类时,才需要考虑其内部实现细节

我们在创建类的时候,要将复杂的细节封装在内部,不让使用者知道,给使用者一些非常简单的接口就可以。

(2)根据经验,并不是类的每个属性都是对外公开的,但一些属性是对外公开的。

(3)必须在类的表示法中定义属性和行为的公开级别

4.2. C++中类的封装

(1)成员变量:C++中用于表示类属性的变量

(2)成员函数:C++中用于表示类行为的函数

(3)C++中可以给成员变量和成员函数定义访问级别(如 public、private 等)

  1. #include <stdio.h>
  2.  
  3. struct Biology
  4. {
  5. bool living;
  6. };
  7.  
  8. struct Animal : Biology
  9. {
  10. bool movable;
  11. void findFood() {};
  12. };
  13.  
  14. struct Plant : Biology
  15. {
  16. bool growable;
  17. };
  18.  
  19. struct Beast : Animal
  20. {
  21. void sleep() {};
  22. };
  23.  
  24. struct Human : Animal
  25. {
  26. void sleep() {};
  27. void work() {};
  28. };
  29.  
  30. struct Girl : Human
  31. {
  32. private:
  33. int age;
  34. int weight;
  35.  
  36. public:
  37. void print()
  38. {
  39. age = ;
  40. weight = ;
  41.  
  42. printf("I'm a girl, I'm %d years old.\n", age);
  43. printf("My weigth is %d kg.\n", weight);
  44. };
  45. };
  46.  
  47. struct Boy : Human
  48. {
  49. private:
  50. int height;
  51. int salary;
  52.  
  53. public:
  54. int age;
  55. int weight;
  56.  
  57. void print()
  58. {
  59. height = ;
  60. salary = ;
  61.  
  62. printf("I'm a boy, my height is %d cm.\n", height);
  63. printf("My salary is %d RMB.\n", salary);
  64. };
  65. };
  66.  
  67. int main()
  68. {
  69.  
  70. Girl g;
  71. Boy b;
  72.  
  73. g.print();
  74.  
  75. b.age = ;
  76. b.weight = ;
  77. //b.height = 180;//Error: private
  78.  
  79. b.print();
  80.  
  81. return ;
  82. }

4.3. 类成员的作用域

(1)类成员的作用域只在类的内部,外部无法直接访问

(2)成员函数可以直接访问成员变量和调用成员函数

(3)类的外部可以通过类变量访问 public 成员

(4)类成员的作用域与访问级别没有关系。(注意 C++中用 struct 定义的类中所有成员默认为 public,而 class 定义的类成员的默认属性为 private)

类成员的作用域

  1. #include <stdio.h>
  2.  
  3. int i = ;
  4.  
  5. struct Test
  6. {
  7. private:
  8.    int i;
  9.  
  10. public:
  11.    int j;
  12.  
  13.    int getI()
  14.    {
  15.        i = ;
  16.  
  17.        return i;
  18.    }
  19. };
  20.  
  21. int main()
  22. {
  23.    int i = ;
  24.  
  25.    Test test;
  26.  
  27.    test.j = ;
  28.  
  29.    printf("main: i = %d\n", i); //i = 2;
  30.    printf("::i = %d\n",::i);  //::i = 1;
  31.    //printf("test.i = %d\n", test.i); //Error
  32.    printf("test.j = %d\n", test.j);   //test.j = 4
  33.    printf("test.getI() = %d\n", test.getI()); //test.getI() = 3
  34.  
  35.    return ;
  36. }

类通常可分为使用方式和内部细节两部分,类的封装机制使得使用方式和内部细节相分离,C++中通过定义类成员的访问级别实现封装机制,public 成员可在类的内部和外界访问和调用,private 成员只能在类的内部被访问和调用。

5.类的关键字

(1)struct 在 C 语言中己经有了自己的含义,必须继续兼容

(2)在 C++中提供了新的关键字 class 用于类定义

(3)class 和 struct 的用法完全相同。但 C++中用 struct 定义的类中所有成员默认访问级别为 public,而 class 定义的类成员的默认访问级别为 private

  1. #include <stdio.h>
  2.  
  3. struct A
  4. {
  5.    //默认访问级别为public
  6.    int i;
  7.    int getI(){return i;};
  8.    
  9. };
  10.  
  11. class B
  12. {
  13.    //默认访问级别为private
  14.    int i;
  15.    int getI(){return i;};    
  16. };
  17. int main()
  18. {
  19.    A  a;
  20.    B  b;
  21.  
  22.    a.i = ;//ok
  23.    printf("a.getI() = %d\n", a.getI());
  24.  
  25.    //b.i = 4; //Error: private
  26.    //printf("b.getI() = %d\n", b.getI()); //Error: private
  27.  
  28.    return ;
  29. }

开发一个用于四则运算的类

  1. //operator.h
  2. #ifndef _OPERATOR_H_
  3. #define _OPERATOR_H_
  4.  
  5. class Operator
  6. {
  7. private:
  8. char mOp; //操作符
  9. double mP1; //操作数1
  10. double mP2; //操作数2
  11.  
  12. public:
  13. bool setOperator(char op);
  14. void setParameter(double p1, double p2);
  15. bool result(double& r);
  16. };
  17.  
  18. #endif
  1. //operator.cpp
  2. #include "operator.h"
  3.  
  4. bool Operator::setOperator(char op)
  5. {
  6. bool bRet = (op == '+') || (op == '-') || (op == '*') || (op == '/');
  7.  
  8. if (bRet)
  9. {
  10. mOp = op;
  11. }
  12. else
  13. {
  14. mOp = '\0';
  15. }
  16.  
  17. return bRet;
  18. }
  19.  
  20. void Operator::setParameter(double p1, double p2)
  21. {
  22. mP1 = p1;
  23. mP2 = p2;
  24. }
  25.  
  26. bool Operator::result(double& r)
  27. {
  28. bool bRet = true;
  29.  
  30. switch (mOp)
  31. {
  32. case '/':
  33. if ((-0.000000001<mP2) && (mP2 <0.000000001))
  34. {
  35. bRet = false;
  36. }
  37. else
  38. {
  39. r = mP1 / mP2;
  40. }
  41. break;
  42.  
  43. case '+':
  44. r = mP1 + mP2;
  45. break;
  46.  
  47. case '-':
  48. r = mP1 - mP2;
  49. break;
  50.  
  51. case '*':
  52. r = mP1 * mP2;
  53. break;
  54. }
  55.  
  56. return bRet;
  57. }
  1. //main.cpp
  2. #include <stdio.h>
  3. #include "operator.h"
  4.  
  5. int main()
  6. {
  7. Operator op;
  8. double r = ;
  9.  
  10. op.setOperator('/');
  11. op.setParameter(, );
  12.  
  13. if (op.result(r))
  14. {
  15. printf("r = %lf\n", r);
  16. }
  17. else
  18. {
  19. printf("Calculate error!\n");
  20. }
  21.  
  22. return ;
  23. }

6.类声明和实现的分离

(1).h 头文件只用类的声明:成员变量和成员函数

(2).cpp 源文件中完成类的其它实现(如成员函数的实现)

C++深度解析教程学习笔记(5)面向对象的更多相关文章

  1. C++深度解析教程学习笔记(6)对象的构造和销毁

    1. 对象的初始化 (1)从程序设计的角度看,对象只是变量,因此: ①在栈上创建对象时,成员变量初始化为随机值 ②在堆上创建对象时,成员变量初始化为随机值 ③在静态存储区创建对象时,成员变量初始化为 ...

  2. C++深度解析教程学习笔记(4)C++中的新成员

    1. 动态内存分配 (1)C++通过 new 关键字进行动态内存申请,是以类型为单位来申请空间大小的 (2)delete 关键字用于内存释放 ▲注意释放数组时要加[],否则只释放这个数组中的第 1 个 ...

  3. C++深度解析教程学习笔记(3)函数的扩展

    1.内联函数 1.1.常量与宏的回顾 (1)C++中的 const 常量可以替代宏常数定义,如: ; //等价于 #define A 3 (2)C++中是否有解决方案,可以用来替代宏代码片段呢? 1. ...

  4. C++深度解析教程学习笔记(2)C++中的引用

    1.C++中的引用 (1)变量名的回顾 ①变量是一段实际连续存储空间的别名,程序中通过变量来申请并命名存储空间 ②通过变量的名字可以使用存储空间.(变量的名字就是变量的值,&变量名是取地址操作 ...

  5. C++深度解析教程学习笔记(1)C到C++的升级

    1.现代软件产品架构图 比如商场收银系统 2.C 到 C++ 的升级 2.1变量的定义 C++中所有的变量都可以在需要使用时再定义,而 C 语言中的变量都必须在作用域开始位置定义. 2.2 regis ...

  6. 《Spring源码深度解析》学习笔记——Spring的整体架构与容器的基本实现

    pring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如下图所示 这些模块被总结为以下几个部分: Core Container Core Container(核心容器)包含有C ...

  7. Webpack新手入门教程(学习笔记)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...

  8. 尚硅谷韩顺平Linux教程学习笔记

    目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...

  9. jfinal框架教程-学习笔记

    jfinal框架教程-学习笔记 JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...

随机推荐

  1. 【lightoj-1026】Critical Links(桥)

    题意: 给出无向图,求桥的模板题. #include <bits/stdc++.h> using namespace std; ; int dfn[N], low[N];//时间戳;low ...

  2. HDU 1561 The more, The Better(树形DP+01背包)

    The more, The Better Time Limit : 6000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other ...

  3. hibernate12--注解

    在之前的基础上删除hbm.xml映射文件 之后修改实体类内容 /** * 部门的实体类 * strategy对应的就是主键生成策略 * GenerationType: * 01.auto:自动选择合适 ...

  4. Web目录结构

    /: Web应用的跟目录,该目录下所有文件在客户端都可以访问(JSP,HTML) /WEB-INF: 存放应用使用的各种资源.该目录及其子目录对客户端都是不可以访问的, 其中包括web.xml(部署表 ...

  5. Mongodb 的劣势

    MongoDB中的数据存放具有相当的随意性,不具有MySQL在开始就定义好了.对运维人员来说,他们可能不清楚数据库内部数据的数据格式,这也会数据库的运维带来了麻烦. 1. 事务关系支持薄弱.这也是所有 ...

  6. Developing on Windows Phone 8 Devices

    Developing on Windows Phone 8 Deviceshttp://docs.madewithmarmalade.com/native/platformguides/wp8guid ...

  7. CRC-16校验原理

    最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码(CRC码): 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. 2.生成CRC码的基本原理: 任意一 ...

  8. UltraEdit编码设置

    1.查看ue文件编码 一直苦于无法判断文件的编码类型,现在发现一个方法,就是用强大的UltraEdit-32软件: UltraEdit-32的状态栏可以显示文件的编码类型,详细情况如下: ANSCI- ...

  9. I.MX6 ethtool 移植

    /************************************************************************* * I.MX6 ethtool 移植 * 说明: ...

  10. yarn  workspace 开发示例

    此为官方示例: package.json { "private": true, "workspaces": [ "workspace-a", ...