EffectiveModernC++简体中文版42招独家技巧助您改善C++11和C++14的高效用法(ScottMeyers高博译)

书:pan.baidu.com/s/1CjUdgAAFLt0X-2T3vgiBxg?pwd=s6cf

  1. 理解模板型别推导:模板型别推导是C++中的一个重要特性,它允许编译器根据传递给模板的实际参数类型来自动推导模板参数的类型。
  2. 理解auto型别推导:在C++11中,引入了auto关键字来进行类型推导。使用auto可以自动推断出变量的类型,而无需显式指定。
  3. 掌握查看型别推导结果的方法:书中介绍了如何查看auto和模板型别推导的结果,这对于调试和理解代码非常有帮助。
  4. 优先选用auto,而非显式型别声明:在适当的情况下,使用auto可以使代码更加简洁和易读。
  5. 当auto推导的型别不符合要求时,使用带显式型别的初始化物习惯用法:在某些情况下,auto推导的类型可能不符合预期,此时可以使用带显式类型的初始化来确保类型的正确性。
  6. 在创建对象时注意区分()和{}:在C++中,使用()和{}来创建对象时,其初始化方式是不同的。书中详细讲解了这两种方式的区别和适用场景。
  7. 优先选用nullptr,而非0或NULL:C++11引入了nullptr关键字,用于表示空指针。使用nullptr可以使代码更加清晰和易于维护。
  8. 优先选用别名声明,而非typedef:C++11引入了别名声明的语法(using),它比typedef更加灵活和易读。
  9. 优先选用限定作用域的枚举型别,而非不限作用域的枚举型别:限定作用域的枚举型别可以避免命名冲突,提高代码的安全性。
  10. 优先选用删除函数,而非private未定义函数:使用删除函数可以明确地表示某个函数不可被调用,这比将函数声明为private但未定义更加直观和易于理解。
  11. 为意在改写的函数添加override声明:在C++11中,可以使用override关键字来明确表示某个函数是重写基类中的虚函数。这有助于编译器检查函数的正确性。
  12. 只要函数不会发射异常,就为其加上noexcept声明:noexcept声明可以告诉编译器某个函数不会抛出异常,这有助于编译器进行更优化的代码生成。
  13. 只要有可能使用constexpr,就使用它:constexpr是C++11引入的一个关键字,用于表示可以在编译时求值的常量表达式。使用constexpr可以提高代码的运行效率和安全性。
  14. 使用std::unique_ptr管理具备专属所有权的资源:std::unique_ptr是C++11引入的一个智能指针类型,它用于管理具有专属所有权的资源。使用std::unique_ptr可以避免内存泄漏和野指针等问题。
  15. 使用std::shared_ptr管理具备共享所有权的资源:std::shared_ptr是另一个智能指针类型,它用于管理具有共享所有权的资源。当多个指针共享同一个资源时,std::shared_ptr可以确保资源在不再需要时被正确释放。
  16. 对于类似于std::shared_ptr、但有可能空悬的指针使用std::weak_ptr:std::weak_ptr是一个弱引用智能指针,它可以用于解决std::shared_ptr之间的循环引用问题。
  17. 理解std::move和std::forward:std::move和std::forward是C++11中引入的两个函数模板,它们用于实现移动语义和完美转发。
  18. 区分万能引用和右值引用:万能引用(也称为转发引用)是一种特殊的引用类型,它可以同时绑定到左值和右值上。了解万能引用和右值引用的区别对于正确使用移动语义和完美转发至关重要。
  19. 优先选用lambda式,而非std::bind:lambda表达式是C++11中引入的一个新特性,它提供了一种简洁而强大的方式来定义匿名函数对象。与std::bind相比,lambda表达式更加灵活和易读。
  20. 对并发使用std::atomic,对特种内存使用volatile:在多线程编程中,std::atomic提供了对原子操作的支持,可以确保操作的原子性和可见性。而volatile关键字则用于表示某个变量可能会被意外地修改(例如,由硬件或中断服务程序修改),从而防止编译器对其进行优化。

这些原文技巧或观点涵盖了C++11和C++14中的许多重要特性和最佳实践,对于提高C++代码的高效性和可维护性非常有帮助。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注