1. 程式人生 > >為string類新增一個賦值運算子函式

為string類新增一個賦值運算子函式

面試中經常會被要求寫一個string類,其實通過寫string類就可以看出來一個人對C++的掌握能力。其實寫string類主要就是看賦值運算子的過載函式的寫法。在這裡我自己實現了兩種。如果大家有更好的辦法請給我留言。

#include  <iostream>
#include <string.h>
#include <assert.h>
using namespace std;
class cstring
{
    public:
        cstring(char* data = "\0")
        {   
            m_data = new char[strlen(data)+1];
            strcpy(m_data,data);
        }   
        ~cstring()
        {   
            delete []m_data;
        }   
        cstring(const cstring &str)
        {   
            m_data = new char[strlen(str.m_data)+1];
            assert(m_data != NULL);
            strcpy(m_data,str.m_data);
        }   
//      cstring& operator=(const cstring &str) //一般方法。
//      {
//          if (this != &str)
//          {
//              delete []m_data;
//              m_data = NULL;
//              this->m_data = new char[strlen(str.m_data)+1];
//              strcpy(this->m_data,str.m_data);
//          }
//          return *this;
//      }

        cstring& operator=(const cstring &str)
        {
            if (this != &str)
            {
                cstring tmp(str);
                char* ptmp = tmp.m_data;
                tmp.m_data = m_data;
                m_data = ptmp;//交換兩個物件的兩個值通過析構臨時物件的成員變數來析構本身的變數。
            }

            return *this;

        }

        void show()
        {
            cout<<this->m_data<<endl;
        }
    private:
        char* m_data;
};


int main()
{
    cstring str("srtff");
    cstring fg(str);
    cstring df;
    df = fg;
    str.show();
    fg.show();
    df.show();
    return 0;
}
第一種一般方法主要過程就是,首先釋放掉本來的記憶體空間,然後為被賦值的物件重新開闢一個和賦值的物件同樣大小的空間,進而將字串拷貝進去。但是這種方法有一個缺點就是如果new失敗了。而且已經將原本的內容delete掉了,所以程式面對的只能是崩潰,不是一個安全且健壯的程式所能展現的。

第二種方法是先構造了一個臨時變數。然後通過臨時變數來將值進行交換,且之後出了該作用域,臨時變數會被析構了。不需要再為沒有new成功卻先delete的方面去考慮。這樣的做法是即簡潔又安全。