一. 你需要一个构造函数吗?
构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的特点:1.构造函数的命名必须和类名完全相同。 2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用。
有些内太简单,它们的结构就是它们的接口,所以不需要构造函数。但是一般情况下都需要构造函数来初始化成员变量。
二. 你的数据成员是私有的吗?
一般都需要将类的数据成员设置为私有,否则设计者将无法控制何时访问这些成员。
三. 你的类需要一个没有参数的构造函数吗?
如果一个类已经有了构造函数,而你想声明该类的对象可以不必显示的初始化它们,则必须显示地写一个午餐的构造函数,例如:
class Point{
public :
Point(int p, int q) : x(p),y(q) {}
...
private:
int x, y;
}
此时,如果使用下面的语句则为非法:
Point p; //因为这里没有指出怎么样初始化对象p
如果需要生成某个类对象的数组的时候,也需要一个无参的构造函数。
四. 是不是每个构造函数初始化所有的数据成员?
五. 类需要析构函数吗?
如果类分配了资源,而这些资源又不会由成员函数自动释放,则需要析构函数
六. 类需要一个虚析构函数吗?
绝不会用作基类的类是不需要虚析构函数的。如果一个类需要被继承一般都需要有一个虚析构函数。虚析构函数通常是空的。
七. 你的类需要复制构造函数吗?
关键要看复制该类的对象是否就相当于复制器数据成员和基类对象。如果不是则需要复制构造函数。
如果你的类在构造函数中分配了资源,则需要一个显示的复制构造函数来管理资源。
如:(此时就需要复制构造函数)
class String {
public:
String();
String(const char *s);
...
private:
char *data; //data 指向了其他的内存,这时候就需要复制构造函数了
}
一般情况下,当类中包含有指针类型的 数据成员,则需要三大函数(复制构造函数,复制操作符,析构函数)。
八. 你的类需要一个赋值操作符吗?
如果需要一个复制构造函数,就一般也需要一个赋值操作符。
九. 你的赋值操作符能正确地将对象赋值给对象本身吗?
比如有这样一个类:
class String{
public:
String & operator = (const String &s);
private:
char *data;
};
下面是一个不正确例子:(一旦向自身赋值则会失败)
String & String::operator=(const String &s)
{
delete [] data;
data = new char [strlen(s.data) + 1];
strcpy(data, s.data);
return *this;
}
一下是正确的实现方式:
String & String :: operator=(const String &s)
{
if( &s != this)
{
delete [] data;
data = new char[strlen(s.data) + 1];
strcpy(data, s.data);
}
return *this;
}
十. 你的类需要定义关系操作符吗?
十一. 删除数组时你记得用delete[] 吗?
十二. 记得在复制构造函数和复制操作符的参数类型中加上const吗?
十三. 如果函数有引用参数,他们应该是const引用吗?