/*
  靜態類成員 和 靜態類方法 可以被所有該類的對象共同享用,
  同時也不需要有對象,而可以直接通過類直接使用的

  技術角度: static的對象或者方法, 這内存中有且僅有一份

  靜態類方法:内只能使用static的成員變量

  推薦:如果一個成員方法沒有使用對象的成員變量,可以定義爲static,這樣子就可以直接通過類來訪問


  Pre-Increment Operator  ++a
    先加,然後再執行表達式
    int a = 10;
    b = ++a; 可以看成
    1> a=a+1; //output: a = 11
    2> b = a; //output: a = 11, b = 11
  Post-Increment Operator  a++
    先執行表達式,再加
    int a = 10;
    b = a++; 可以看成
    1> b=a; //output: a = 10, b = 10;
    2> a=a+1; //output: a = 11, b = 10

  int a = 10;
  b = ++a;



*/
class Esp32 {
  private:
  public:
    static int count; // class成員變量 , 千萬不用忘記初始化,不能直接在這裏初始化,也不能在構造函數裏初始化

    static void total() {  //class成員方法,只能使用static的成員變量
      Serial.print("當前ESP32開發板數量為 : ");
      Serial.println(count);
    }

    static void info() { //未使用對象的成員變量,這時候可以使用static,讓該方法可以直接通過class訪問
      Serial.println("ESP32 開發板");
      Serial.println("技術文檔請參考espressif網站");
    }

    String model;

    Esp32(String model_p = "UNKOWN") {
      model = model_p;
      ++count;
    };

    ~Esp32() {
      --count;
    }
  protected:
};

//想想爲什麽不能再構造函數里進行初始化
int Esp32::count = 0; //初始化static成員變量

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  int a, b;
  a = 10;
  b = ++a;
  Serial.println("Pre-Increment b = ++a");
  Serial.println(" a = " + String(a));
  Serial.println(" b = " + String(b));

  a = 10;
  b = a++;
  Serial.println("Post-Increment b = a++");
  Serial.println(" a = " + String(a));
  Serial.println(" b = " + String(b));

  Esp32::total();  // 0

  Esp32 e1("ESP32-WROOM");
  Esp32 e2("ESP32-WROVER");
  Esp32 e3("ESP32-C3");
  Esp32::total();  // 3

  Esp32 * e4 = new Esp32("ESP32-S2");
  Esp32 * e5 = new Esp32("ESP32-S3");
  Esp32::total();  // 5
}

void loop() {

  Esp32::total();  // 2  想想看這裏爲什麽是2?
  delay(100000L);
}