【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示例,编译成功后会上传到开发板运行。
- 本文由用户 老张 发布,文中观点仅代表作者本人,不代表本站立场。
- 如需转载,请联系作者;如有侵权,请联系本站处理。

2025-12   阅读(833)   评论(0)
 标签: 创客 ESP32 Arduino Cpp

涨知识
二进制

二进制(binary),发现者莱布尼茨,是在数学和数字电路中以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示 。

评论:
相关文章
【ESP32 C++教程】Unit4-3 红外接收和遥控

本小节主要讲解红外接收和遥控器件,以及遥控操作LED。


【ESP32 C++教程】Unit4-2 模拟量传感器

本小节讲解模拟量传感器使用,旋转电位器,DHT11温湿度传感器和实现自定义传感器类。


【ESP32 C++教程】Unit4-1 数字量传感器

本小节讲解Sensor类及派生类、数字量传感器使用和传感器的推荐交互流程。


【ESP32 C++教程】Unit3-2 触摸输入

本小节讲解ESP32内置触摸引脚的用法,


【ESP32 C++教程】Unit3-1 按键输入

本小节主要介绍按键信号转换、Button类及派生类、和Button交互推荐流程。


【ESP32 C++教程】Unit2-2 Ws2812灯珠

本小节主要介绍Ws2812灯珠的使用、对父类进行扩展实现自定义功能,和指针向下强制转换的使用。


【ESP32 C++教程】Unit2-1 RGB三色LED

本小节主要介绍RGB三色LED的使用,以及多态的具体实现。


【ESP32 C++教程】Unit1-3 ESP32 Arduino 开发框架

ESP32 Arduino Framework是专门针对ESP32开发板的Arduino应用开发框架,为用户开发IOT应用、HMI应用提供一致的开发体验。


ESPConnect:基于浏览器的ESP32管理器

ESPConnect是一个基于现代浏览器的管理器,在你需要快速验证、调试、管理文件、检查状态的时候,它能帮你省下大量打开和切换重型工具的时间。


用ESP32做一个FM收音机

本文介绍两种使用TEA5767收音机模块实现FM收音机的方案,感兴趣的朋友可在此基础上实现更丰富的功能。