C++入门(个人学习笔记)

主要参考资料:
B站Up主孤独的二进制《ESP32上的面向对象》

目录

  • 继承关系和包含关系
  • 复合类和多态
  • 类和结构区别:
  • C与C++字符串相互转换
  • C++的优势
  • 《Unix》

继承关系和包含关系

第二集20:30
1.类里面 不加public 默认为private
2._pin 类里面加下划线习惯为private
3.只读操作在后面方法后面加const
4.::为类里面的方法定义

第三集头文件和源文件
1.原来只要看.h就知道有哪些方法了(.h叫接口文件,.cpp叫实现文件/源文件)
2.在.h里写type类型要#inclde“arduino.h”
3.头文件卫士#ifnodef

第四集 构造函数与析构函数
重载(overload)构造函数的概念
LED::LED(byte pin_param,String color_param):_color(color_param){}//通过:来给_color赋值color_param 模板 ( :要被赋值的对象(值))
析构函数(用来释放内存释放资源)格式:~函数
this是指针;*this是对象

第五集:
缺省:默认的意思

第七集继承的三种关系:(先讲is a 父子关系,has a 汽车与引擎关系后面说)
this就是个指向自己的指针,写不写好像没啥区别
Class Esp32Board : public DevBoard{} //公开继承就是把父类 DevBoard 的Public和Protected给拷贝过来
Class Esp32Board : private DevBoard{} //私有继承就是把父类 DevBoard 的所有都私有起来(私有后就没法再往下公开继承了)
Class Esp32Board : protected DevBoard{} //保护继承就是把父类 DevBoard 的所有都保护起来(保护后还可以再往下公开继承)
所以说ESP32Board是派生类;DevBoard是基类
基类表

第八集继承的构建函数
1.当你创建了一个类(比如cube),1.内存会分配空间2.会运行类的构建函数cube(),来初始化变量
2.要想访问基类的private里面的变量只能用一个中间方法(把基类的函数拿过来,通过这个函数调用了private)来访问,可以在public里面创建方法
3.当你用对象想来继承类时,只能继承public和protected,想把父类的private的变量也继承过来,就得用在继承函数后面加上:构造函数(私有参数)

子类实例化后一般是不会调用父类的构造函数的,如果需要使用父类的private,可以在子类的构造函数后面用:继承父类的构造函数,构造函数使用private。

第九集多继承(父类有好多个)(不被推荐也不怎么用)
1.构造函数里需要对初始变量赋值
2.多继承的问题就是如果public里面命名相同,包括父类父类的相同,父类子类的相同
3.对象:(继承)类

第十集手搓LGVL
1.C++的优势就是抽象,一般不需要看的详细省去,你写代码用.h就行
2.this->可写可不写
3.制作.cpp源文件需要添加#include “Arduino.h”
4…h放class定义,具体的类::方法放到源文件.cpp里面

复合类和多态

第十一集引用和指针
引用是”别名“,int &ref = v1;
指针是地址
区别
(1)引用初始化必须赋值。
(2)指针可以被重新分配
(3)指针有自己的地址,引用的地址与变量一致。
(4)引用不能为空,甚至不能为常数。要求变量
什么时候用
如果变量值可能会变,那就用指针。

第十二集复合类
类和类之间的关系:复合类(has a)把其中整个类作为自己的数据成员,包含关系
几种写法:
OLED oled;//生成大类的时候同时生成小类
OLED *oled;//生成指针, 可以先不存储,用nullptr,比较灵活,绝大部分用指针
所以说,类定义可以用具体值,也可以用指针

第十三集关联关系

第十四集多态虚函数(function iverloading)
条件:1.继承 2. 指针或引用调用
可以用父类来声明子类

第十五集多态划重点
https://blog.csdn.net/weixin_50569901/article/details/124003064
多态分为静态多态和动态多态
overload重载(静态多态)一个函数通过多个参数来达到不同的形态
动态多态需要使用虚函数
override覆盖,告诉编译器我这个函数要被覆盖。起保险的作用。
redefine重定义,基类不使用虚函数virtual,子类就处于重定义状态,不能实现多态。对象会直接调用基类的函数。
加final说明子类不能对它进行复写

第十六集抽象类(烧腊)和具体类(烧鸭)
有一个以上的纯虚函数的类就是抽象类,抽象类不能具体化 virtual int available() = 0;

第十七集 静态类成员(使用Static)
一般变量不同的类会创造不同的变量,静态类变量是所有的类共用同一个变量。有一个类把静态变量改了,那其他的也会变掉。
静态的成员方法使用的变量也一定是静态的
(在函数外定义,就只能在本文件被使用;在函数内定义,只能在本文件使用)
用extern 就可以全域使用;用static就只能本区域使用,避免了耦合和重入

第十八集 动态分配pointer(使用malloc和new对int数组对象分别是怎么用的)(无操作系统不介意直接使用堆,会造成堆内存碎片化)
动态内存分配在heap里(堆)
静态内存分配在stack里(栈)First in ,last out

Malloc(10)代表给了10个字节 new int(100)代表赋值了100

第十九集( const常量的用法)
从右往左读

第二十一集
Explicit是显性标识符,用在定义前就表明不准隐式转换了。

第二十三/二十四集 操作符重载(operating overloading)
操作符就是±*/,本来这些只是对于有类型的int、char这些来说,但是你对对象弄就错了,所以可以在类里面加操作符重载函数,转换成具体的值的加减乘除之类的
操作符重载的原则,如果你看到操作符却不知道什么意思,要返回到.cpp文件去看,就已经失败了

第二十五集 template
template
特点:<>

第二十六集 inline
本质:拿空间换时间(程序员使用inline建议(只是建议,不是命令)编译器直接用函数主体把调用给替换掉,这样函数占用stack可能多一些,但是快了)
如果在声明里面就写了函数主体,那就是默认的inline,你写不写inline都是inline;如果拿出来定义的话就必须写inline了
最后,现在cpu已经很快了,这个的作用?存疑

第二十七集 回调函数
建立一个回调函数,用函数指针把回调函数调过来
函数名本质上就是个指针

类和结构区别:

1.结构体是一种值类型,而类是引用类型。值类型用于存储数据的值,引用类型用于存储对实际数据的引用。
那么结构体就是当成值来使用的,类则通过引用来对实际数据操作。

2.结构使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)
栈的空间相对较小.但是存储在栈中的数据访问效率相对较高.
堆的空间相对较大.但是存储在堆中的数据的访问效率相对较低.

3.类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体也可以继承,也可以有函数(c中结构体没有函数),但是不具备类的继承多态特性

4.结构体赋值是 直接赋值的值. 而对象的赋值的是传递对象的地址

5.结构体内默认“数据“访问权限和继承权限是public,对象内“”成员“”默认访问权限和继承权限是private。结构体和类可以交叉继承,继承权限取决于子类而不是基类。

指向结构体成员运算符
指向结构体或对象的指针->其内成员

C与C++字符串相互转换

char c = ‘’; //C语言字符定义
Char c[]=””; //C语言没有所谓的字符串,一般用字符数组和字符指针代替
Char *c=’’;
String c=””;//C++定义字符串
两者转换
String.c_str() //可以转换成const *C

#include
#include
using namespace std;
int main()
{
char ch = ‘X’;
string s ;
char s1[2] = {ch, 0};//定义一个字符数组,即传统的字符串,使其值为单个字符加上字符串结束符\0。
s = s1;//将字符赋值给string对象。
cout << s << endl;
}

C++的优势

Automatic destruction and RALL(resource acquisition is initialization )

《Unix》

用户态的进程、线程三等公民、root线程二等公民、硬件中断一等公民

App_task掌握其他任务的生杀大权,它的时间流程是确定。

每个任务都有事件组负责监控任务状态。任务与任务之间使用队列进行通讯,由app_task给其他任务发送任务通知。

你可能感兴趣的:(嵌入式软件,c++,学习,笔记)