1.ESP8266-簡單的類和物件
阿新 • • 發佈:2021-01-14
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燈。
建構函式:其中一個建構函式是有參的建構函式,還有一個建構函式是無參的建構函式,在我們建立一個物件的時候,可以使用下面的方法:
cpp Led myLed;
,此時使用的是無引數的構造方法建立該物件,則在建立物件的時候,會預設呼叫無參建構函式Led();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()
{
}
- 首先我們在setup()這個函式裡面建立了一個名為myLed的一個物件
Led myLed(2);
,物件被建立的時候會執行裡面的有參建構函式,此時串列埠會輸出**“Led Object Created”**,並將2號引腳初始化為輸出。 - 當程式執行到
Serial.println("Hello, this is from setup()");
的時候,會輸出**“Hello, this is from setup()”** - 執行迴圈,將LED點亮-熄滅3次。
- setup()函式即將被執行完畢,這個時候在setup()函式內部被建立的物件都會被刪除,在物件即將被刪除之前,會呼叫類裡面的解構函式,這個時候串列埠會列印**“Led Object Deleted”**,所以, 函式內部的物件的生命週期是從該物件在函式內部被建立的時刻開始,到這個函式結束的時候。