- 构造和析构函数中调用虚函数,由于其派生类还未被构造和已被析构,所以得到的结果不会是预期的。
- 重载父类虚函数,需要加上
override
关键字
Effective C++ :赋值重载的注意点
复制重载涉及到拷贝赋值和移动赋值两种情况,有些点需要注意一下。
Effective C++ :delete 优于私有未定义行为
Effective C++ :异常的注意点
Effective C++ :为多态基类声明 virtual 析构函数
为保证多态析构的正确性,需要为基类的虚构函数加上virtual
:
1 | #include <iostream> |
Effective C++ :认识编译器的默认生成函数
编译器默认会为一个类提供(如果它们需要被使用的话):
- 默认构造函数:如果类编写了构造函数,则编译器就不会自动提供默认构造函数了
- 使用
default
显示声明也可以在有其他构造函数的情况下,让编译器产生默认构造函数
- 使用
- 拷贝构造函数:没有移动函数显示定义时,拷贝函数才会被隐式的创建。其单纯地将每一个数据成员进行拷贝
- 如果数据成员中的对象具有它自己的拷贝构造函数,则也会调用它
- 拷贝赋值函数:单纯地将每一个数据成员进行拷贝
- 如果数据成员中的对象具有它自己的拷贝赋值函数,则也会调用它
- 析构函数:隐式的
noexcept
- 移动构造函数:当没有显示定义移动、拷贝、析构函数时,默认移动函数才会被隐式的创建
- 移动赋值函数
生成的特殊函数是隐含的public
和inline
的,但大部分情况下都是非虚函数。
>
只有当一个类继承自基类,基类的析构函数是虚函数时,生成派生类的析构函数才也是虚函数
Effective C++ :对象的初始化
要养成好的习惯:永远在使用对象之前先将它初始化。 - 对于内置类型,在定义时就初始化 - 对于类类型,在构造函数初始值列表中按照声明顺序初始化 + 类类型中的私有变量是内置类型时,也可以在声明时初始化,这样可以避免初始值列表过长。 + 如果期望类类型中的对象以默认构造函数初始化时,那也可以不用放在初始值列表中
Effective C++ :const,enum,inline 优于 define
宏在 c++ 中要尽可能少的使用,在google c++ 编码规范中也是建议使用宏要谨慎。
Effective C++ :尽可能使用 const
谷歌
c++ 编码规范也比较推崇尽量使用const
。
STM32 SPI 作为从机的注意事项
两个 stm32 通过 SPI 进行通信,一主一从,但从机不能使用 CubeMX 的默认配置,不然会被带进坑……