C++ 沉思录——Chap4:设计类的核查表

一. 你需要一个构造函数吗?

     构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的特点:1.构造函数的命名必须和类名完全相同。 2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用。
     有些内太简单,它们的结构就是它们的接口,所以不需要构造函数。但是一般情况下都需要构造函数来初始化成员变量。
二. 你的数据成员是私有的吗?
     一般都需要将类的数据成员设置为私有,否则设计者将无法控制何时访问这些成员。
三. 你的类需要一个没有参数的构造函数吗?
     如果一个类已经有了构造函数,而你想声明该类的对象可以不必显示的初始化它们,则必须显示地写一个午餐的构造函数,例如:
class Point{
          public :
               Point(int p, int q) : x(p),y(q) {}
               ...
          private:
               int x, y;
}
此时,如果使用下面的语句则为非法:
 
如果需要生成某个类对象的数组的时候,也需要一个无参的构造函数。
 
四. 是不是每个构造函数初始化所有的数据成员?
 
 
五. 类需要析构函数吗?
     如果类分配了资源,而这些资源又不会由成员函数自动释放,则需要析构函数
 
六. 类需要一个虚析构函数吗?
     绝不会用作基类的类是不需要虚析构函数的。如果一个类需要被继承一般都需要有一个虚析构函数。虚析构函数通常是空的。
 
七. 你的类需要复制构造函数吗?
     关键要看复制该类的对象是否就相当于复制器数据成员和基类对象。如果不是则需要复制构造函数。
     如果你的类在构造函数中分配了资源,则需要一个显示的复制构造函数来管理资源。
     如:(此时就需要复制构造函数)
     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引用吗?
 
 
posted @ 2012-07-25 21:56  KingsLanding  阅读(309)  评论(0编辑  收藏  举报