【ESP32 C++教程】Unit1-2 C++类基础知识

本小节主要介绍C++ 类相关的基础知识,包括类的定义、继承、多态,范围作用域等。
C++是在C编程语言基础上发展出来的一门编程语言,C是面向过程编程,而C++是面向对象编程,这是两种不同的编程思想。
面向过程编程是一种以过程为中心的编程方式,它将问题分解成一系列的步骤,然后按照顺序执行这些步骤,以达到求解问题的目的。在面向过程编程中,数据和操作是分离的,函数是处理数据的主要手段。
面向对象编程强调把问题分解成对象,通过封装、继承和多态等机制,来处理对象之间的关系。每个对象都可以独立地处理自己的数据和行为,而不需要依赖其他对象。面向对象编程更加注重代码的重用性、可维护性和可扩展性。
本小节只简单的介绍类相关的一些基本知识,若需深入学习请参考相关C++书籍。

一、类和对象

C++中使用class关键字来声明类,如下:
class Animal {
public:
    // 构造函数
    Animal(const std::string& nickname) : nickname_(nickname) { }

    // 让类外部可以访问到nickname_
    const std::string& nickname() const { return nickname_; }

    // 行为1:喂食
    virtual bool Feed(const std::string& food) {
        return false;
    }

    // 行为2:叫唤
    virtual void Shout() {
    }

protected:
    // 数据
    const std::string nickname_;  // 昵称

private:
};
在声明体内,可以定义方法和数据,一般将数据放在private和protected下,以达到封装数据的目地。
使用virtual修饰的方法可以在派生类中重写以实现不同的行为。
要使用类,需要创建类的实例(即对象),如下:
Animal *a1 = new Animal("来福");
a1->Shout();

作用域public/protected/private的说明
1.在调用层面(即水平方向),public对外部调用者是可访问的;
2.在继承层面(即重直方向),public和protected对子类是可访问的;
3.private是私有的;
如图所示
【ESP32 C++教程】Unit1-2 C++类基础知识


二、类继承

继承允许一个类(子类)继承另一个类(父类)的非私有的数据和方法,子类可以重用父类的代码,并且可以在不修改原有代码的情况下进行扩展和修改。
通过在声明类时指定父类来实现继承关系,如下:
class Dog : public Animal {
public:
    Dog(std::string& nickname) : Animal(nickname) { }

    bool Feed(const std::string& food) override {
         if (food == "骨头") {
            Serial.printf("%s:吃了一根骨头。\n", nickname_.c_str());
            return true;
         }
         return false;
    }

    void Shout() override {
          Serial.printf("%s:汪~汪~汪~。\n", nickname_.c_str());
    }

    // 看门
    void WatchDoor() {
    }
}
类Dog继承类Animal,然后重写了Feed和Shout方法(加override修饰),使用代码:
Dog *dog1 = new Dog("来福")
dog1->Feed("骨头");
dog1->WatchDoor();
// 用父类指针指向子类实例是安全的,反之是危险的,可能产生非法访问。
Animal *a1 = dog1;
a1->Shout();

三、多态

多态使得对象可以根据情况表现出不同的行为,简单来讲就是通过父类指针来访问子类实现方法的一种技术手段。
再声明一个Cat类,如下:
class Cat : public Animal {
public:
    Cat(std::string& nickname) : Animal(nickname) { }

    bool Feed(const std::string& food) override {
         if (food == "鱼") {
            Serial.printf("%s:吃了一条鱼。\n", nickname_.c_str());
            return true;
         }
         Serial.printf("%s:猫要吃鱼。\n", nickname_.c_str());
         return false;
    }

    void Shout() override {
          Serial.printf("%s:喵~喵~喵~。\n", nickname_.c_str());
    }

    // 抓鱼
    void CatchFish() {
    }
}
多态实现代码:
定义一个函数,使用animal指针做为参数,
void feed(Animal *animal) {
    animal->Feed("骨头");
}
当调用feed函数时,传入Dog实例指针和Cat实例指针,函数的行为就是多态。
Dog *dog1 = new Dog("来福");
Cat *cat1 = new Cat("旺财");
feed(dog1);  // 串口打印:吃了一根骨头。
feed(cat1);  // 串口打印:猫要吃鱼。

四、实例

从 https://gitee.com/billyzh/esp32-cpp-lesson 下载本教程的源码到本地硬盘文件夹,如d:\esp32-cpp-lesson
在VSCode中,选择【文件】->【打开文件夹...】选择上一步保存的文件夹打开
选择config.h文件,修改第10行为 
#define APP_LESSON12   1
【ESP32 C++教程】Unit1-2 C++类基础知识
接着打开项目中的esp32-cpp-lesson.ino文件,点击右上角的【上传/upload】按钮,开始编译lesson12示例,编译成功后会上传到开发板运行。
- 本文由用户 老张 发布,文中观点仅代表作者本人,不代表本站立场。
- 如需转载,请联系作者;如有侵权,请联系本站处理。

20:02   阅读(1)   评论(0)
 标签: 创客 ESP32 Arduino Cpp

涨知识
舵机

舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。在高档遥控玩具,如飞机、潜艇模型,遥控机器人中已经得到了普遍应用。

评论:
相关文章
【ESP32 C++教程】Unit1-1 开发环境准备

本讲主要介绍VSCode Arduino开发环境的搭建,及与Arduino IDE开发环境的比较。


ESP32 WebServer库处理表单请求

本文主要讲解WebServer库如何来处理表单请求。



在esp32上运行WebServer

WebServer是非常常用的一个功能,在设备上使用该功能可以直接通过浏览器访问和操作设备。


C++ 格式化字符串:std::format 详解

在 C++20 中,标准库引入了 std::format 功能,这是一个强大的字符串格式化工具,它提供了类似 Python 的格式化语法,使得字符串格式化变得更加简单和直观。


Arduino-ESP32与ESP-IDF的版本对应表

Arduino-ESP32与ESP-IDF的版本对应表。


Arduino-ESP32文件系统全解析:SPIFFS、LittleFS、SD卡操作

Arduino-ESP32提供了多种文件系统解决方案,本文将深入解析SPIFFS、LittleFS和SD卡三种主流存储方案,帮助你做出最佳选择。


ESP32-P4-WIFI6开发板

ESP32-P4-WIFI6-DEV-KIT是一款微雪(Waveshare)设计的基于 ESP32-P4 的多媒体开发板,并集成 ESP32-C6,支持 Wi-Fi 6 和 BLE 5 无线连接。它提供丰富的人机交互接口,包括 MIPI-CSI (集成图像信号处理器 ISP)、MIPI-DSI、SPI、I2S、I2C、LED PWM、MCPWM、RMT、ADC、UART 和 TWAI 等。


ESP-Hosted 入门介绍 &使用指南

ESP-Hosted 解决方案提供了将 ESP 板用作 Wi-Fi 和 Bluetooth/BLE 连接的通信处理器的方法。


设备上云太麻烦?ESP-Hosted一站触达!

ESP-Hosted 提供了一种将ESP芯片和模组用作通信协处理器的解决方案,该解决方案为主机微处理器或微控制器提供无线连接,使主机能够与其他设备通信。简单来说为网卡方案。