zoukankan      html  css  js  c++  java
  • 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引用吗?
     
     
  • 相关阅读:
    Tomcat 中会话超时的相关配置
    Oracle10g任务调度创建步骤
    Oracle的三种高可用集群方案
    软/硬件负载均衡产品 你知多少?
    Nginx、LVS及HAProxy负载均衡软件的优缺点详解
    java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
    TortoiseSVN客户端重新设置用户名和密码
    Linux下oracle数据库启动和关闭操作
    Linux下使用ps命令来查看Oracle相关的进程
    【Kill】两条Linux命令彻底杀死Oracle
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2609031.html
Copyright © 2011-2022 走看看