zoukankan      html  css  js  c++  java
  • 《SLAM导航机器人基础》第二章:C/C++编程(后)

    2.6节,面向对象设计

    在前面,我们讲解了使用函数,封装重复代码的机构性设计方法。这种思路是以功能划分,把一个程序分解不同的功能模块,每个函数完成一个功能,最后再组合起来。这种设计方法在小型程序中是简洁并且可行的。但随着程序代码量的扩大,会遇到很多功能相似但又有区别的模块。数据变量和函数的关系在结构化设计中,只有局部变量和全局变量两种。变量和使用该函数之间并没有做关系的确定,没有对数据进行分类和保护。面向对象设计,与结构化设计这样面向过程的设计不一样,它把程序按实际应用的事物进行分类的。简单讲,结构设计是把一个事物按不同功能实现了,但没有考虑到后续升级维护可能需要程序也能处理类似事物。面向对象,要求程序员在最初的代码框架中,先分析事物本身的属性,从而可以在顶层设计中覆盖未来要升级的情况。下面我们讲解面向对象是如何实现的。

    面向对象,在实际编程中是以类实现的,类是一种数据类型,类变量称为对象。类中,包含数据变量和函数,均具有三种访问权限属性:公有public、私有private和保护型protected。公有类型的变量或函数,可以在类外的程序中使用,而私有类型只能在类内使用。面向对象设计具有四大特性:抽象、封装,继承和多态。抽象,指的是我们使用类的方法,把具有类似属性的事物进行了分类,比如把电脑按操作系统属性分成windows电脑和苹果电脑。封装,指的是类的公有public、私有private和保护型权限属性的设计,体现了面向对象在数据安全性方面的优势。继承,指的是类和类之间可以继承,比如windows电脑类和苹果电脑类继承自电脑类,他们均和电脑类有共同的属性:CPU、内存、硬盘、操作系统等。继承的属性体现了面向对象在升级维护性方面的优势。多态,指的是继承自同一个基类的不同子类中,均可使用基类相同名称的函数,这样不同类对象,调用统一的函数接口,会得到不同的功能实现。这在结构化设计中是难以实现的。

    以上是面向对象的理论内容,下面在具体的程序中学习类的定义和使用。

    #include <iostream>
    using namespace std;
    
    //类的定义示例
    class Computor 
    {
       public:
          string name;  //产品名
          string cpu;   // CPU型号
          int    ram;   // 内存大小,单位GB
          int    rom;   // 硬盘大小,单位GB
          void show(void)
          {
              cout<<"CPU:"<<cpu<<endl;
          }
    };
    
    //类继承示例
    class Mac: public Computor 
    {
       public:
          void show(void)
          {
              cout<<name;
              cout<<":MacOS"<<",CPU:"<<cpu<<",";
                showRAM();//私有类型的函数,只能在类内调用
          }
       private:
          void showRAM(void)
          {
              cout<<"RAM:"<<ram<<"G"<<endl;
          }
    };
    
    class Win: public Computor
    {
       public:
          void show(void)
          {
              cout<<name;
              cout<<":Windows"<<",CPU:"<<cpu<<endl;
          }
    };
     
    int main( )
    {
       //类对象的初始化示例
       Mac MacBookAir;   //定义苹果电脑对象MacBook
       Win RedmiBook;    //定义windows电脑对象RedmiBook
       //设置MacBook参数 
       MacBookAir.name = "MacBookAir 2020";
       MacBookAir.cpu = "i7-1060"; 
       MacBookAir.ram = 8; 
       MacBookAir.rom = 256;
       //设置RedmiBookk参数
       RedmiBook.name = "RedmiBook 2020";
       RedmiBook.cpu = "R5-4500";
       RedmiBook.ram = 16;
       RedmiBook.rom = 512;
     
       //多态示例
       MacBookAir.show();
       RedmiBook.show();
       
       return 0;
    }

     相关理论讲解内容,也可在菜鸟网站上继续学习https://www.runoob.com/cplusplus/cpp-classes-objects.html

    2.7节,高级编程概述

    以下并不属于C++入门内容,所以我们只做概念介绍,后续Linux章节中,会在具体编程实践中学习。

    2.7.1异常处理

    在我们的程序遇到不适用情形就会发生异常,比如我们在通信过程中,连线突然中断。c++异常中包含捕捉异常和抛异常。

    抛异常,使用throw语句。比如我们可以在函数中检查输入数据的情况,遇到不适用的情形,及时跑出异常。

    捕捉异常,try{捕捉异常的语句段}catch(异常类型 变量名){异常处理语句段}

    2.7.2文件操作

     C++文件操作中,使用fstream标准库实现。

    文件操作类型包括,读文件类型ifstream,写文件类型ofstream

    文件操作接口函数:

    void open(const char *filename, ios::openmode mode); //打开文件
    void close();//关闭文件

    2.7.3多线程操作

     多线程,指的是我们可以同时做多样事情。简单理解,单向成相当于一个人干活,多线程相当于多个人一起干活。

    一般地,我们不创建线程,程序就会从main()函数中循序执行,但我们使用创建线程接口pthread_create (thread, attr, start_routine, arg)时,我们就可以指出另一个独立循序的函数,这样我们就同时在运行两个循序函数。

    结束时,可以调用pthread_exit (status)终止线程。当然,多线程带来性能提升的同时也带来了麻烦,程序不再依次执行,它是并行的,数据可能会被另一个线程篡改,我们需要对数据等进行制定访问机制。

  • 相关阅读:
    个人作业——软件工程实践总结作业
    用户调查报告
    β总结
    凡事预则立
    学习进度条
    作业八——单元测试练习(个人练习)
    作业七——“南通大学教务管理系统微信公众号” 用户体验分析
    作业六——团队作业(学生成绩录入系统设计与实现)
    作业5——需求分析(学生成绩录入系统)
    作业4.2:结对项目—— 词频统计(第二阶段)
  • 原文地址:https://www.cnblogs.com/Baron-Lu/p/13275245.html
Copyright © 2011-2022 走看看