学习自:太极创客。
实践是检验真理的唯一标准,通过arduino进行实践学习C++或许是一个不错的选择。
目标:
实现LED灯闪烁五次。
创建类对象:
创建一个类:LED
行为:①打开LED、②关闭LED
属性:①LED引脚编号
抽象(抽象出类的成员):
对LED进行归纳抽象,提取其中的共性,得到以下抽象描述:
数据抽象(共同属性/数据成员):
int ledPin; //LED引脚编号
功能抽象(共同行为/函数成员):
①void on() //打开LED;
②void off() //关闭LED;
硬件搭建
代码实现:
class Led {
public:
void on(); //打开LED
void off(); //关闭LED
int ledPin = 3;//初始化引脚编号为3(要与硬件搭建一致)
};//注意这边要有分号结束
void Led::on() { //对ledPin输出高电平
digitalWrite(ledPin, HIGH);
}
void Led::off() { //对ledPin输出低电平
digitalWrite(ledPin, LOW);
}
void setup() {
Led myLed; //定义Led类对象myLed
pinMode(myLed.ledPin,OUTPUT); //设置为OUTPUT
for (int i = 0; i < 5; i++) {//LED灯闪烁5次
myLed.on();
delay(500);
myLed.off();
delay(500);
}
}
void loop() {
}
实验现象
实现引脚编号为3的LED闪烁5次。
代码详解
① 类的定义。
class:即类。class Led{ }
表示创建Led类,其中函数成员和数据成员描述了抽象的结果。“{”和“}”限定了类的边界。";"表示类创建结束。
class 类名称
{
public:
外部接口(公有成员);
protected:
保护型成员;
private:
私有成员;
};
如:
class Led {
public:
void on();
void off();
int ledPin = 3;
};
②类成员的访问控制
对类成员访问权限的控制,是通过设置成员的访问控制属性实现的。关于访问控制权限的关键字有:public(公有类型)、protected(保护类型)、private(私有类型),用来指定类的成员(数据成员&函数成员)的访问权限。
public:即公有的 ,定义了类的外部接口,后面声明类的公有成员,在类外只能访问类的公有成员。
private:即私有的,后面声明类的私有成员。若私有成员紧接类名称,则关键字private可省略。只能被本类成员函数访问,来自类外部的任何访问都是非法的,完全隐蔽类中,保护数据安全性。(后面会对该程序进行变化来说明这个问题)
PS:一般数据成员都应该声明为私有成员,这样内部数据不会对该类以外部分造成影响。
③成员函数的实现
void Led::on() 、void Led::off()
:即成员函数的具体实现,写在类定义之外。
成员函数的原型声明写在类体中,说明函数的参数表和返回值类型,如:void off();
。
与普通函数不同是,实现成员函数时要指明类的名称,如: myLed.on();、myLed.off();
成员函数实现的具体形式:
返回值类型 类名::函数成员名(参数表)
{
函数体
}
如:
void Led::off()
{
digitalWrite(ledPin, LOW);
}
④对象
类是一种抽象机制,描述一类事物的共同属性,类的对象就是该类的某一特定实体(实例),如:整个公司的雇员看作一个类,那么每个雇员就是该类的特定实体即对象。
声明对象的具体形式:
类名 对象名;
如:
Led myLed;
PS:对象所占据的内存空间只是用于存放数据成员,函数成员不在每一个对象中存储副本,每个函数的代码在内存中只占据一份空间。
⑤数据成员的调用
访问数据成员的一般形式是:
对象名.数据成员名
如:
myLed.ledPin
⑥成员函数的调用
调用成员函数与调用普通函数的差异在于需要使用“.”操作符指出调用所针对的对象(目的对象)。
调用函数成员的一般形式是:
对象名.函数成员名(参数表)
如:
myLed.on();
PS:在类的外部只能访问到类的公有成员;在类的成员函数中,可以访问到类的全部成员。