用法
- 声明类
- 声明有作用域枚举类型
- 在模板声明中,class 可用于引入类型模板形参与模板模板形参
- 若作用域中存在具有与某个类类型的名字相同的名字的函数或变量,则 class 可附于类名之前以消歧义,这产生一个详述类型说明符
什么是类
- C++类是创建新类型的工具,创建出的新类型可以像内置类型一样的方便使用。而且,派生类和模板允许程序员表达类之间的(层次和参数化)管理并利用这种关系。
- 一个类型就是一个概念的具体表示。比如C++内置类型float以及其运算+、-、*、/等一起提供了数学概念”实数“的一种近似表示。
- 定义新类型的基本思想是将实现的细节(比如,某种类型对象的数据存储布局)与正确使用它的必要属性(比如,可访问的函数的完整列表)分离。这种分离的最佳表达方式是:通过一个专用接口引导数据结构以及其内部辅助程序的使用。
- 类是用户自定义类型。一个类就是一个包含成员的名字空间。
- public提供类的接口,private成员提供实现细节
- struct是成员默认为public的class
示例
class Foo;
class Bar {
public:
Bar(int i) : m_i(i) {}
private:
int m_i;
};
template <class T>
void qux() {
T t;
}
int main()
{
Bar Bar(1);
class Bar Bar2(2);
}
建议
- 应该将构造函数、赋值操作以及析构函数设计为一组匹配的操作
- 使用构造函数为类建立不变式
- 如果一个构造函数获取了资源,那么这个类就需要一个析构函数来释放该资源
- 如果一个类有虚函数,它就需要一个虚析构函数
- 如果一个类没有构造函数,它可以进行逐成员初始化
- 在构造函数中优先选择成员初始化而不是赋值操作
- 优先选择移动语义和写前拷贝而不是浅拷贝
- 优先使用{}初始化而不是()初始化
- 按声明顺序初始化成员和基类
- 使用类内初始化器来提供默认值
- 当且仅当类对象有“自然的”默认值才为类定义默认构造函数
- 如果一个默认构造函数、赋值操作或者析构函数是恰当的,让编译器自动生成它
- 如果一个类是一个容器,为它定义一个初始化器列表构造函数
- 如果一个类有一个引用成员,它可能需要非默认拷贝操作
- 如果一个类有一个指针成员,它可能需要非默认拷贝操作和析构函数
- 如果一个类是一个资源句柄,它可能需要非默认拷贝/移动操作、构造函数、析构函数
- 如果一个类需要一个拷贝操作或一个析构函数,它可能需要一个构造函数、一个析构函数、一个拷贝赋值操作和一个拷贝构造函数
- 当编写一个拷贝构造函数时,小心拷贝每个需要拷贝的元素
- 一个拷贝操作应该提供等价性和独立性
- 小心纠缠的数据结构
- 显示说明一个不变式:用构造函数建立不变式,用赋值操作保持不变式
- 确保拷贝赋值操作能够安全的自赋值
- 当向类添加一个新成员时,检查用户自定义构造函数是否需要更新,以便初始化新加入的成员