cpp沉思录笔记1---类设计者的核查表
你的类需要一个构造函数吗?
简单的类不需要构造函数,他们的结构就是他们的接口。
你的数据成员是私有的吗?
你的类需要一个无参的构造函数吗?
如果一个类已经有了构造函数,而你想声明该类的对象可以不必显式地处时候它们,则必须显式地写一个无参的构造函数。
是不是每个构造函数初始化所有数据成员?
构造函数的用途就是用一种明确定义的状态来设置对象。对象的状态由对象的数据成员反应。因此,每个构造函数都要负责为所有的数据成员设置经过明确定义的值。
但是,类有时会有一些数据成员,它们只在它们的对象存在了一定时间之后才有意义。
类需要析构函数吗?
不是所有有构造函数的类都需要析构函数。只有在该类分配了资源,而这些资源又不会由成员函数自动释放时,才需要。
类需要一个虚拟析构函数吗?
虚拟析构函数是为了解决这样的一个问题:基类指针指向派生类对象,并用基类的指针删除派生类对象。即,用作基类的类的析构函数一般都是虚的。
你的类需要复制构造函数吗?
关键在于复制该类的对象是否就相当于复制其数据成员和基类对象。如果不相当于,就需要复制构造函数。
如果你的类在构造函数内分配资源,则可能需要一个显式的复制构造函数来管理资源。有析构函数(非空)的类通常是用析构函数来释放构造函数分配的资源,这通常也说明需要一个复制构造函数。
如果不想用户能够复制类的对象,就声明复制构造函数(可能还有赋值操作符)为私有的。
你的类需要一个赋值操作符吗?
如果需要复制构造函数,同理多半也会需要一个赋值操作符。如果不想用户能够设置类中的对象,就将赋值操作符私有化。
类X的赋值由X::operator=来定义。通常,operator=应返回一个X&,并且由return *this结束以保证与内建的复制操作符一致。
你的赋值操作符能正确地将对象赋给对象本身吗?
如果原对象和目标对象时同一个,而我们又奉行”先释放旧值,再复制”的行事规程,那么就可能在还没有实施复制之前就把原对象销毁了。避免这个问题的最简单的方法就是显式地加以预防(先判断是否与this相同),或者先将旧的目标值保存起来,直到将源值复制完成。
你的类需要定义关系操作符吗?
删除数组时你记住了使用delete[]吗?
记得在复制构造函数和赋值操作符的参数类型中加上const了吗?
复制构造函数应该是像X::X(const X&)这样。
同样,赋值操作符应为X::operator=(X&)
如果函数有引用参数,它们应该是const引用吗?
记得适当地声明成员函数为const的了吗?
如果确信一个成员函数不用修改它的对象,就可以声明它为const,这样就可以把它用于const对象了。