zoukankan      html  css  js  c++  java
  • 【Effective C++】Effective C++笔记

    Effective C++

    1. 知道C++为一个语言的联邦而非单种语言

    2. 使用const、enum和inline替代宏

    3. 尽量使用const

    4. 确定对象已被初始化 (编译器不保证变量被初始化,跨平台和编译器的问题)

    5. 了解C++默认编译和调用的函数(并取消之)

    6. 明确取消不想由编译器自动生成的函数

    7. 为多态类实现虚函数(不是多态的就不要用虚函数了)

    8. 别让异常逃离析构函数

    9. 不在构造和析构过程调用virtual函数(从这里起,想起来要做什么比不要做什么让人更印象深刻)

    10.令operator=返回一个reference to *this

    11. 处理operator=的自我赋值

    12. 复制对象时勿忘其每一个成分

    13. 以对象管理资源(看到auto_ptr、智能指针)

    14. 资源管理类中小心使用copy行为(智能指针,删除器)

    15.在资源管理类中提供对原始资源的访问(智能指针强转)

    16.成对使用new和delete时要采取相同形式(数组要用[])

    17.以独立语句将newed对象置入智能指针(即对象最好单独写一条语句, 否则可能泄露)

    18.让接口容易被正确使用,不易被误用(例如相同作用的函数的名称一致性; 不同dll内的shared_ptr最好声明自己的删除器)

    19. 如type一样设计class(创建、销毁、赋值;传递值;合法值、类型转换、操作符;)

    20. 宁以pass-by-reference-to-const替换pass-by-value(对非原生类型而言;参数切割可以被避免)

    21.必须返回对象时,别妄想返回其reference

    22. 将成员变量声明为private

    23. 宁以non-member、non-friend替换member函数 (为了更好的封装性;写到命名空间里)

    24. 若所有参数需要类型转换,请为其采用non-member函数(non-member函数可以直接变成重载的运算符)

    25. 考虑写出一个不抛异常的swap函数

    26. 尽可能延后变量定义的出现时间

    27. 尽量少做转型操作(dynamic_cast耗费成本很大, 强转为继承类,而且是底层代码用的较多,调用基类的方法只能写清楚类名Base::(而非通过cast))

    28. 避免返回handles指向对象内部成分

    29. 为“异常安全”而努力是值得的(注意回收资源;防止异常造成对象损坏)

    30. 透彻了解inlining的里里外外(带函数指针的参数可能不被inline)

    31. 将文件间的编译依存关系降至最低(头文件只写声明不写定义)

    32. 确定你的public继承可以模拟出”is-a”关系(书里没给出解决方案)

    33. 避免遮盖继承而来的名字(不想遮盖时,using 名称, 多个副本; 用转交函数遮盖继承)

    34. 区分接口继承和实现继承(接口继承:全部虚函数; 虚函数被继承会被直接使用,但是不一定所有的函数要都要虚函数)

    35. 考虑virtual 函数以外的其他选择(template method模式(跟template无关), 子类不重载高层函数,而是重载底层函数)

    36. 绝不重新定义继承而来的non-virtual 函数

    37. 绝不重新定义继承而来的缺省参数值(而是用非virtual调用private的virtual,这样只要改private virtual就可以了)

    38. 通过复合模拟出has-a或”根据某物实现出”(is a和has a的区别;用包含的方法实现类)

    39. 明智而审慎地使用private继承(可以在class里定义类)(EBO: 空白基类最优化)

    40. 明智而审慎地使用多重继承

    模板与泛型编程

    41.了解隐式接口和编译期多态(对template而言)

    42.了解typename的双重意义(在STL兼容类型调用内部类型T的时候必须让编译器知道T是个typename)

    43. 学习处理模板化基类里的名称

    44. 将与参数无关的代码抽离templates

    45. 运用成员模板函数接受所有兼容类型

    46. 需要类型转换时请为模板定义非成员函数(即friend函数进行类型转换后调用内部函数)

    47. 请使用traits classes类型信息(设计一个类的萃取器)

    48. 认识template元编程(TMP)

    定制new和delete

    49.了解new-handler的行为 (自己重写new操作符)

    50. 了解new和delete的合理运算时机

    51. 编写new和delete时需固守常规

    52. 写了placement new也要写placement delete

    Miscellany 杂项讨论

    53. 不要忽视编译器的警告

    54. 让自己熟悉包括TR1在内的标准程序库(C++ 1.1, 正则表达式, 哈希表)

    55. 让自己熟悉Boost(http://boost.org, C++和python间的支持)

  • 相关阅读:
    python flask学习笔记
    语音识别2 -- Listen,Attend,and Spell (LAS)
    语音识别 1--概述
    keras中seq2seq实现
    ResNet模型
    Bytes类型
    Python操作文件
    Pyhon基本数据类型
    ping
    find
  • 原文地址:https://www.cnblogs.com/wangzming/p/8111130.html
Copyright © 2011-2022 走看看