代码意图要直观
int month(); 没有表示是否会修改日期对象 也没表示 返回的是一个月份
Month month() const; 建议这样做
int index = -1;
for (int i=0; i<v.size(); ++i)
{
if(v[i]==val)
{
index = i;
break;
}
}
// 不需要手动管理索引 显示使用for 说明对STL 不了解
auto it = std::find(begin(v),end(v),val);
尽可能用iso标准写c++代码
尽可能地使用 C++ 标准库提供的功能,而不是依赖特定于编译器的扩展或非标准库
写的代码不要是 micsoft 编译器独占的语法
理想情况下程序应该是静态类型安全的
for (const auto& v: vec){...} 表明了不会修改 容器vec 的元素
for (auto& v: vec){...} 不清楚 不清楚是否要修改 容器vec 的元素
std::for_each(std::execution::par,vec,[](auto v){...}) 并行遍历容器,对每个元素执行操作(按值传递),不会修改容器元素
// c++17 中可以用std::variant 安全替代联合体
基于模板的泛型代码减少了转型的需要,因此,也减少了类型错误
c数组调用一个函数时,会发生数组退化, c++20 开始 使用std::span 自动推算c数组的大小,旧版本可以使用Guidelines支持库GSL 提供的实现
窄化转换
int i1(3.14);
用{} 告诉编译器
int i1{3.14}
编译器检查 优先于 运行期检查
static_assert() 编译期间断言
模板参数的类型
常量表达式是否符合预期条件
编译阶段检查某些配置是否正确
编译时的策略选择
不能在编译期间检查的事项 应该在运行期间检查
dynamic_cast
尽早识破运行期间错误
管理好指针和c数组
转换 也需要检查,尽量避免转换
不要泄漏任何资源
内存 文件 套接字
处理方法是RAII 资源获取即初始化
锁负责处理互斥量 智能指针 负责处理原始内存 STL 容器负责处理底层元素
不要浪费时间和空间
追求效率的另一个好处是,这个过程迫使你更深入地了解问题
std::transform 简化 for 循环 同时不会出现越界
优先选择不可变数据,而不是可变数据
推理常量比推理变量更容易。
不可变在并发场景下非常好用,常量不会发生数据竞争。
封装杂乱的代码
杂乱的代码容易出错
应该封装到 数据类型或方法中
适当地使用支持库
c++标准库
CoreGuidelines库
boost库
类似这样代码 文档齐全的库