《Ruminations on C++》定义类时的核查表

当定义一个类时需要做的一些检查:

1 .是否 需要构造函数? 大多数类都需要构造函数,只有一些简单的类——结构就是它们的接口,这时就不需要构造函数

2.是否将数据成员声明为私有?数据成员最好声明为私有,当对数据成员进行引用或修改时,最好是通成员函数。如果没有通过成员函数设置数据成员,则如果数据成员是由用户直接设置的变量,则无法马上检测到用户所作的改变

3.是否需要一个无参的构造函数? 
class Point{
public:
          Point(int p, int q): x(p), x(q){}

private:
          int x, y;
}
如果定义了一个如上的一个有一个构造函数的类,且该构造函数需要参数时,则下面的语句将是非法的:
Point p;		
Point pa[100];
因此有时需要在对象数组和把类的所有实例都初始化之间做出权衡

3. 每个构造函数都初始化所有的数据成员了吗? 构造函数的用途就是为每个对象设置一种明确的状态,状态是通过数据成员进行反映的,因此构造函数应该负责给每个数据成员赋予初始值,但这并非绝对,因为有些数据成员在程序中可能过段时间才会被用到,也可能不会被用到——上一篇《《Ruminations on c++》c++ 和 c 的一些区别 》中的第二点,函数没有被调用,导致一些数据成员没被使用


4. 是否需要显式的析构函数如果在类的方法中使用了new 表达式或者任何动态分配内存的机制,则通常需要在析构函数中加上相应的delete表达式


5. 是否需要显式的虚析构函数 只要在有一个基类的指针指向它的派生类对象,且需要delete该指针时,就要给基类加上虚析构函数
B* bp = new D;		//B为基类,D从B派生
delete bp;
虚析造函数通常是空的

6. 是否需要复制构造函数这一点需要注意的是复制构造函数中要分配内存,否则,两个对象会指向同一个内存地址,因而导致在调用析构函数时,该内存会被销毁两次


7. 是否需要一个赋值操作符 有时候需要复制构造函数时,多半也需要一个赋值操作符。有时为了不让用户和自己调用某些成员函数,多半会出现如下声明
class Thing{
public:
	//...

private:
	Thing(const Thing&);
	Thing& operator=(const Thing&);

};
只需要声明它们,没必要定义他们

8. 赋值操作符能赋值给对象本身吗赋值一般总是遵循“先释放旧值,再复制”的规则,但当原对象和目标对象是同一个时,就会出现错误,因为原对象在复制之前就被销毁了,因此需要在复制前作一些检查:
String& String::operator=(const String& s){
	if(&s != this){			//检查
  		delete [] data;
  		data = new char[strlen(s.data) + 1];
  		strcpy(data, s.data);
	}
return *this;
}


9. 是否需要关系操作符 如果需要创建类型的有序集合,则必须提供关系操作符


10. 删除数组时,使用 delete[] 了吗删除任何类型的数组时使用 [] 是一个好的习惯,因为这个可能会减小开销。C++在进行删除时,要求用户告知删除的是不是数组,如果是,那么实现就可能会提供一个地方来存储长度(常数)——在创建数组时,它会在数值地址前多分配4个字节的空间用于存储长度,delete[] 删除时则会从存储长度的地址开始删除——可认为是array[-1],因此大多数情况下new要和delete配对使用,new [] 和 delete [] 配对使用

11. 是否应该加上const 在复制构造函数和赋值操作符中最好使用const参数,因为在该过程中不会改变原对象,另外在指针形参和指针实参中,const形参能有const和非const实参,而非const形参只能有非const实参
class Vector{
public:
 	int length();
	//..
};
int pdded_length(const &v, int n)
{
  	int k = v.length();	//错误,const实参无法赋值给非const形参
 	//..
}

















 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值