设计一个类的时候需要考虑的问题:
1、你的类是否需要一个构造函数
2、你的数据成员是否私有化
使用函数返回私有数据成员的值,并且函数要使用const,说明私有数据成员不能被修改。
3、你的类是否需要一个无参的构造函数
能否定义成数组的形式
4、是不是每个构造函数初始化所有的数据成员
初始化时构造函数的主要任务
5、类是否需要析构函数
看类是够使用了new,及是否分配了 资源
6、类是否需要一个虚析构函数
struct B{
string s;
};
struct D:struct B
{
string t
};
int main()
{
B* dp = new D;
delete dp;
return 0;
}
delete dp这语句会调用错误的析构函数,因为没有动态绑定,也就是没有虚函数,他会调用B的析构函数,如果将B的析构函数定义成virtual的话,这个语句会调用D的析构函数
这里的struct B应该要有一个虚析构函数
struct B
{
string s;
virtual ~B()
{
}
}
7、类是否需要复制构造函数
复制该类的对象是否就是相当于copy类的数据成员和基类对象,如果是的话,就么有必要,否则应该定义复制构造函数
例如:String类,保存String的值是char*data,
当复制构造函数调用的时候,如果没有定义,二者将指向共同的地址
8、类是否需要一个赋值操作符
一般和7共同出现
9、类的赋值操作符能否正确的将对象赋给对象本身
String& String::operator=(String &other)
{
if(&other!=*this){
delete []data;
data = new char[strlen(other.data)+1]
strcpy(data,other.data)
return *this;
}
return *this;
}
这个函数那个if语句主要的作用是保证能够自己赋给自己的时候不会出现错误。
假设没有if判断,当出现自己赋值给自己的时候,delete语句会删除数据,other.data的内容页删除。。。。
10、类是否需要定义关系操作符
可能需要排序或者是比较操作
11、删除数组时,时候使用了 []delete
这一点是和c语言的malloc函数兼容的同时关注效率。
12、在赋值操作符和复制构造函数的参数中加上const
因为二者的参数只是想当与复制,没有修改的必要,并且绑定一个非const引用到一个临时的对象时非法的,使用X::X(X&)作为复制构造函数,是不会允许任何特殊表达式的结果
13、如果函数有引用参数,他们应该是const引用吗?
只有但函数想改变参数的值得时候,才不适用const,否则一般的情况下都需要加上const
因为右值不能够复制给非const的引用变量上。
14、适当的声明成员函数为const