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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章