1.你的类需要构造函数吗
2.你的数据成员是私有的吗
3.你的类需要一个无参的构造函数吗
如果没有无参的构造函数则下面的定义是错误的:
Point p; //错误:没有初始化
Point pa[100] //错误
4.是不是每个构造函数初始化所有的数据成员?
构造函数的用途就是用一种明确的状态来设置对象。
对象的状态由对象的数据成员进行反映。因此,每个
构造函数都要负责为所有的数据成员设置经过明确定义
的值,如果构造函数没有做到这一点,就很可能导致错误。
5.类需要析构函数吗?
不是所有有构造函数的类都需要析构函数。例如,
表示复数的类及时有构造函数也可能不需要析构函数
。如果深入考虑一个类要做些什么,那么该类是否
需要析构函数的问题就十分明显了。应该问问该类
是否分配了资源,而这些资源又不会由成员函数自动释放,
这就足够了。
6.类需要一个虚析构函数吗?
有些累需要虚析构函数只是为了声明它们的析构函数是虚的。
当然,决不会用作基类的类是不需要虚析构函数的:任何虚
函数只在继承的情况下才有用。只有在多态的情况下才需要使用
虚析构函数。
7.你的类需要复制构造函数吗?
关键在于复制该类的对象是否就相当于复制其数据成员和基类对象。
如果并不相当,就需要复制构造函数。如果你的类在构造函数中分配资源,
则可能需要一个显示的复制构造函数来管理资源。有析构函数(除了空的
虚析构函数外)的类通常是用析构函数来释放构造函数分配的资源,
这通常也说明需要一个复制构造函数。
8.你的类需要一个赋值操作符吗?
9.你的复制操作符能正确地将对象赋给对象本身吗?
赋值总是用新值取代目标对象的旧值。如果原对象和目标对象是
同一个,而我们又奉行“先释放旧值,再复制”的行事规程,那么就可能在还
没有实施复制之前就把原对象销毁了。例如:
class string{
public:
string& operator=(const string& s);
private:
char* data;
};
我们很容易就用下面的方法来实现赋值:
string& string::operator=(const string& s)
{
if(&s !=this){
delete [] data;
data=new char[strlen(s.data)+1];
strcpy(data,s.data);
}
return *this;
}
}
10.你的类需要定义关系操作符吗?
11.删除数组时你记住用delete[]吗?
12.记得在复制构造函数和复制操作符的参数类型中加上const了吗?
13.如果函数有引用参数,它们应该是const引用吗?
14.记得适当地声明成员函数为const的了吗?
2.你的数据成员是私有的吗
3.你的类需要一个无参的构造函数吗
如果没有无参的构造函数则下面的定义是错误的:
Point p; //错误:没有初始化
Point pa[100] //错误
4.是不是每个构造函数初始化所有的数据成员?
构造函数的用途就是用一种明确的状态来设置对象。
对象的状态由对象的数据成员进行反映。因此,每个
构造函数都要负责为所有的数据成员设置经过明确定义
的值,如果构造函数没有做到这一点,就很可能导致错误。
5.类需要析构函数吗?
不是所有有构造函数的类都需要析构函数。例如,
表示复数的类及时有构造函数也可能不需要析构函数
。如果深入考虑一个类要做些什么,那么该类是否
需要析构函数的问题就十分明显了。应该问问该类
是否分配了资源,而这些资源又不会由成员函数自动释放,
这就足够了。
6.类需要一个虚析构函数吗?
有些累需要虚析构函数只是为了声明它们的析构函数是虚的。
当然,决不会用作基类的类是不需要虚析构函数的:任何虚
函数只在继承的情况下才有用。只有在多态的情况下才需要使用
虚析构函数。
7.你的类需要复制构造函数吗?
关键在于复制该类的对象是否就相当于复制其数据成员和基类对象。
如果并不相当,就需要复制构造函数。如果你的类在构造函数中分配资源,
则可能需要一个显示的复制构造函数来管理资源。有析构函数(除了空的
虚析构函数外)的类通常是用析构函数来释放构造函数分配的资源,
这通常也说明需要一个复制构造函数。
8.你的类需要一个赋值操作符吗?
9.你的复制操作符能正确地将对象赋给对象本身吗?
赋值总是用新值取代目标对象的旧值。如果原对象和目标对象是
同一个,而我们又奉行“先释放旧值,再复制”的行事规程,那么就可能在还
没有实施复制之前就把原对象销毁了。例如:
class string{
public:
string& operator=(const string& s);
private:
char* data;
};
我们很容易就用下面的方法来实现赋值:
string& string::operator=(const string& s)
{
if(&s !=this){
delete [] data;
data=new char[strlen(s.data)+1];
strcpy(data,s.data);
}
return *this;
}
}
10.你的类需要定义关系操作符吗?
11.删除数组时你记住用delete[]吗?
12.记得在复制构造函数和复制操作符的参数类型中加上const了吗?
13.如果函数有引用参数,它们应该是const引用吗?
14.记得适当地声明成员函数为const的了吗?