Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. ##1. 构造函数
  2. **不要在构造函数中调用虚函数, 也不要在无法报出错误时进行可能失败的初始化!**
  3.  
  4.  
  5. * 在构造函数中可以进行各种初始化操作.
  6.  
  7.  
  8. **使用构造函数的优点:**
  9.  
  10. * 无需考虑类是否被初始化.
  11.  
  12. * 经过构造函数完全初始化后的对象可以为 `const` 类型, 也能更方便地被标准容器或算法使用.
  13.  
  14.  
  15.  
  16. **缺点:**
  17.  
  18. * 如果在构造函数内调用了自身的虚函数, 这类调用是不会重定向到子类的虚函数实现. 即使当前没有子类化实现, 将来仍是隐患.
  19.  
  20. * 在没有使程序崩溃 (因为并不是一个始终合适的方法) 或者使用异常 (因为已经被`禁用`了) 等方法的条件下, 构造函数很难上报错误
  21.  
  22. * 如果执行失败, 会得到一个初始化失败的对象, 这个对象有可能进入不正常的状态, 必须使用 `bool IsValid()` 或类似这样的机制才能检查出来, 然而这是一个十分容易被疏忽的方法.
  23.  
  24. * 构造函数的地址是无法被取得的, 因此, 举例来说, 由构造函数完成的工作是无法以简单的方式交给其他线程的.
  25.  
  26.  
  27. ##2. 可拷贝类型和可移动类型
  28. ####定义
  29. * 可拷贝类型允许对象在初始化时得到来自相同类型的另一对象的值, 或在赋值时被赋予相同类型的另一对象的值, 同时不改变源对象的值. 对于用户定义的类型, 拷贝操作一般通过拷贝构造函数与拷贝赋值操作符定义. `string` 类型就是一个可拷贝类型的例子.
  30.  
  31. * 可移动类型允许对象在初始化时得到来自相同类型的临时对象的值, 或在赋值时被赋予相同类型的临时对象的值 (因此所有可拷贝对象也是可移动的). `std::unique_ptr<int>` 就是一个可移动但不可复制的对象的例子. 对于用户定义的类型, 移动操作一般是通过移动构造函数和移动赋值操作符实现的.
  32. &nbsp;
  33.  
  34. ##3. 结构体VS类
  35. **原则:仅当只有数据成员时使用 `struct`, 其它一概使用 `class`.**
  36.  
  37. * 在 C++ 中 `struct` 和 `class` 关键字几乎含义一样. 我们为这两个关键字添加我们自己的语义理解, 以便为定义的数据类型选择合适的关键字.
  38.  
  39. * `struct` 用来定义包含数据的被动式对象, 也可以包含相关的常量, 但除了存取数据成员之外, 没有别的函数功能. 并且存取功能是通过直接访问位域, 而非函数调用. 除了构造函数, 析构函数, `Initialize(), Reset(), Validate()` 等类似的用于设定数据成员的函数外, 不能提供其它功能的函数.
  40.  
  41. * 如果需要更多的函数功能, `class` 更适合. 如果拿不准, 就用 `class`.
  42.  
  43. * 为了和 `STL` 保持一致, 对于仿函数等特性可以不用 `class` 而是使用 `struct`.
  44.  
  45. 注意: 类和结构体的成员变量使用不同的命名规则.
  46. &nbsp;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement