# 理念 **理念性规则强调一致性,因此,无法进行检查** ## 1.在代码中直接表达思想 **程序员应该直接用代码表达他们的思想,因为代码可以被编辑器和工具检查** ```cpp class Data{ //... public: Month month() const;//这样做 int month();//不要这样 //... } ``` + 第二个成员函数`month()`既没有表示它不修改日期对象, 也没有表示它返回一个月份。 ==一个专业的C++开发者应该了解 **STL算法**== 使用它们,可以避免显示使用循环,代码也会易于理解和维护。 >现代C++中有一句谚语: >如果你显式使用循环的话,说明你不了解 **STL 算法**。 ## 2.用ISO标准C++写代码 + 使用当前的C++标准,不要使用编译器扩展。 + 要注意未定义行为和实现定义行为。 > 当你必须使用没有写在 **ISO** 标准里的扩展时,可以用一个稳定的接口将它们封装起来。 ## 3.表达意图 ```cpp for(const auto& v:vec){...} // (1) for(auto& v:vec){...} //(2) std::for_each(std::execution::par,vec,[](auto v){...}); //(3) ``` + 循环(1)并不会修改容器vec的元素。但是对于循环(2)来说并不成立。 + 算法`std::for_each(3)`以并行方式(std::execution:par)执行。 这意味着我们并不关心以何种顺序处理元素。 >这个算法使用C++17中的并行算法支持,以并行方式遍历`vec`。这通常用于提高性能,特别是当`vec`非常大,或者循环体中的计算非常复杂时。**然而,因为它是并行的,你不能依赖元素被处理的顺序。** ## 4.理想情况下,程序应该是静态安全的 在编程时,最好能确保所有的变量、对象和函数调用在编译期(Compile-time)就明确它们的类型,以避免在运行期(Run-time)出现类型错误。 + 在 `C++17`中,可以使用`std::variant`安全地替代联合体。 + 基于模板的泛型代码减少了转型的需要,因此,也减少了类型错误。 + 在`C++20`里使用`std::span`可以自动推算出C数组的大小,也可以防止范围错误的发生。 + 窄化转换是对算术值的有精度损失的隐式转换。 ```cpp int i1(3.14); int i2 = 3.14; 如果你使用{}初始化语法,编译器就能检测到窄化转换。 int i1{3.14}; int i2 = {3.14}; ```