1.ESP8266-简单的类和对象

ESP8266面向对象编程之简单的类和对象

创建一个类(class)的方法:

class Led       // 通常建立一个类,第一个字母大写
{
    
    
    public:
    	int ledPin = 2;
        Led();  // 构造函数没有返回类型,且与类名完全相同,在对象建立的时候执行
        Led(int ledPin);  // 构造函数没有返回类型,且与类名完全相同,在对象建立的时候执行
        ~Led(); // 析构函数,在对象被删除之前被执行
        void on();
        void off();
};              // 在class后面必须有一个分号,表示这个类结束了

以上代码创建了一个名为Led的一个类,类的主体使用{ } 包含,在类的结束一定要有分号。

其中公有属性即public:里面有类的成员变量和成员函数。用到的函数以及成员变量应该先在里面进行声明,然后再进行函数的具体实现。

其中成员变量:包括ledPin,我们可以给ledPin一个默认值2,引脚2这个灯是ESP8266 NodeMcu的一个板载的LED灯。
构造函数:其中一个构造函数是有参的构造函数,还有一个构造函数是无参的构造函数,在我们创建一个对象的时候,可以使用下面的方法:

  1. cpp Led myLed;,此时使用的是无参数的构造方法创建该对象,则在创建对象的时候,会默认调用无参构造函数Led();
  2. cpp Led myLed(7);,此时使用的是有参数的构造方法创建该对象,则在创建对象的时候,会默认调用有参构造函数Led(int ledPin);

析构函数: ~Led(); // 析构函数,在对象被删除之前被执行

成员函数

void on(); 	
void off();

构造函数的具体实现:下面的代码是实现构造函数Led(),构造函数会在创建对象的时候被调用其中::表示Led()这个函数是属于Led这个类的

Led::Led()      // ::表示Led()这个函数是属于Led这个类的
{
    
    
    Serial.println("Led Object Created");
    pinMode(LED_BUILTIN, OUTPUT);
}

// 给变量赋值的方法1:
// Led::Led(int ledPin)      // ::表示Led()这个函数是属于Led这个类的
// {
    
    
//     this->ledPin = ledPin;
//     Serial.println("Led Object Created");
//     pinMode(ledPin, OUTPUT);
// }

// 给变量赋值的方法2:
Led::Led(int ledPin) : ledPin(ledPin)      // ::表示Led()这个函数是属于Led这个类的
{
    
    
    Serial.println("Led Object Created");
    pinMode(ledPin, OUTPUT);
}

析构函数的具体实现:

Led::~Led() // ::
{
    
    
    Serial.println("Led Object Deleted");
}

以上代码是析构函数,是在对象被删除的时候被调用的。

构造函数和析构函数是一对孪生兄弟,构造函数是在一个对象被创建的时候被调用,而析构函数是在一个对象被删除的时候被调用的。

成员函数的具体实现

void Led::on()
{
    
    
    digitalWrite(ledPin,LOW);
}

void Led::off()
{
    
    
    digitalWrite(ledPin,HIGH);
}

下面通过一个例子来分析程序的运行过程。

class Led       // 通常建立一个类,第一个字母大写
{
    
    
    public:
        int ledPin = 2;
        Led();  // 构造函数没有返回类型,且与类名完全相同,在对象建立的时候执行
        Led(int ledPin);  // 构造函数没有返回类型,且与类名完全相同,在对象建立的时候执行
        ~Led(); // 析构函数,在对象被删除之前被执行
        void on();
        void off();
};              // 在class后面必须有一个分号,表示这个类结束了

Led::Led()      // ::表示Led()这个函数是属于Led这个类的
{
    
    
    Serial.println("Led Object Created");
    pinMode(ledPin, OUTPUT);
}

// 给变量赋值的方法1:
// Led::Led(int ledPin)      // ::表示Led()这个函数是属于Led这个类的
// {
    
    
//     this->ledPin = ledPin;
//     Serial.println("Led Object Created");
//     pinMode(ledPin, OUTPUT);
// }

// 给变量赋值的方法2:
Led::Led(int ledPin) : ledPin(ledPin)      // ::表示Led()这个函数是属于Led这个类的
{
    
    
    Serial.println("Led Object Created");
    pinMode(ledPin, OUTPUT);
}

Led::~Led() // ::
{
    
    
    Serial.println("Led Object Deleted");
}

void Led::on()
{
    
    
    digitalWrite(ledPin,LOW);
}

void Led::off()
{
    
    
    digitalWrite(ledPin,HIGH);
}


// Led myLed;      // 全局对象,在程序中所有的函数中,都可以使用该对象

void setup()
{
    
    
    Serial.begin(74880);
    //Led myLed;     // 函数内部创建一个对象,只在函数内有效,其他函数中无法使用该对象
    Led myLed(2);
    Serial.println("Hello, this is from setup()"); 
    for(int i = 0; i < 3; i++)
    {
    
    
        myLed.on();
        delay(500);
        myLed.off();
        delay(500);
    }
}

void loop()
{
    
    

}
  1. 首先我们在setup()这个函数里面创建了一个名为myLed的一个对象Led myLed(2);,对象被创建的时候会执行里面的有参构造函数,此时串口会输出**“Led Object Created”**,并将2号引脚初始化为输出。
  2. 当程序执行到Serial.println("Hello, this is from setup()");的时候,会输出**“Hello, this is from setup()”**
  3. 执行循环,将LED点亮-熄灭3次。
  4. setup()函数即将被执行完毕,这个时候在setup()函数内部被创建的对象都会被删除,在对象即将被删除之前,会调用类里面的析构函数,这个时候串口会打印**“Led Object Deleted”**,所以, 函数内部的对象的生命周期是从该对象在函数内部被创建的时刻开始,到这个函数结束的时候。

猜你喜欢

转载自blog.csdn.net/qq_43715171/article/details/112558306