《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)终止线程。当然,多线程带来性能提升的同时也带来了麻烦,程序不再依次执行,它是并行的,数据可能会被另一个线程篡改,我们需要对数据等进行制定访问机制。

posted @ 2020-07-16 13:16  baronluu  阅读(307)  评论(0编辑  收藏  举报