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