String类的构造函数、拷贝构造函数、赋值函数和析构函数

原形:
class String
 { 
  public: 
     String(const char *str = NULL); // 普通构造函数 
       String(const String &other); // 拷贝构造函数 
      ~ String(void); // 析构函数 
        String & operate =(const String  &other); // 赋值函数 
  private: 
     char *m_data; // 用于保存字符串 
 };
    //普通构造函数
    String::String(const char *str) 
   {
     if(str==NULL) 
      {
      m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'/0'的空
        //加分点:对m_data加NULL 判断
        *m_data = '/0'; 
      } 
      else
    {
       int length = strlen(str); 
         m_data = new char[length+1]; // 若能加 NULL 判断则更好 
        strcpy(m_data, str); 
      }
   }
   // String的析构函数
   String::~String(void) 
   {
     delete [] m_data; // 或delete m_data;
   }
   //拷贝构造函数
   String::String(const String &other)    // 得分点:输入参数为const型
   { 
     int length = strlen(other.m_data); 
      m_data = new char[length+1];     //加分点:对m_data加NULL 判断
    strcpy(m_data, other.m_data); 
   }
   //赋值函数
   String & String::operate =(const String &other) // 得分点:输入参数为const型
   { 
     if(this == &other)   //得分点:检查自赋值
        return *this; 
      delete [] m_data;     //得分点:释放原有的内存资源
    int length = strlen( other.m_data ); 
     m_data = new char[length+1];  //加分点:对m_data加NULL 判断
      strcpy( m_data, other.m_data ); 
       return *this;         //得分点:返回本对象的引用
   }
 剖析:
  能够准确无误地编写出String类的构造函数、拷贝构造函数、赋值函数和析构函数
的面试者至少已经具备了C++基本功的60%以上!
  在这个类中包括了指针类成员变量m_data,当类中包括指针类成员变量时,一定要
重载其拷贝构造函数、赋值函数和析构函数,这既是对C++程序员的基本要求,也是《E
ffective C++》中特别强调的条款。
  仔细学习这个类,特别注意加注释的得分点和加分点的意义,这样就具备了60%以上
的C++基本功!
  试题8:请说出static和const关键字尽可能多的作用
  解答:
  static关键字至少有下列n个作用:
  (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存
只被分配一次,因此其值在下次调用时仍维持上次的值;
  (2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它
函数访问;
  (3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范
围被限制在声明它的模块内;
  (4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而
只能访问类的static成员变量。
  const关键字至少有下列n个作用:
  (1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常
需要对它进行初始化,因为以后就没有机会再去改变它了;
  (2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为cons
t,或二者同时指定为const;
  (3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内
部不能改变其值;
  (4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修
改类的成员变量;
  (5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值
不为“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
  operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编
译出错:
classA a, b, c;
(a * b) = c; // 对a*b的结果赋值
  操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。
  剖析:
  惊讶吗?小小的static和const居然有这么多功能,我们能回答几个?如果只能回答
1~2个,那还真得闭关再好好修炼修炼。
  这个题可以考查面试者对程序设计知识的掌握程度是初级、中级还是比较深入,没
有一定的知识广度和深度,不可能对这个问题给出全面的解答。大多数人只能回答出st
atic和const关键字的部分功能。ss
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章