String類的設計筆記----C++學習之路

  1.防衛式聲明

  2.字符串是大小不固定的,那就是用指針來動態分配內存,用new的方式動態分配一個內存,所以在private中應該是一個char* m_data;

  3.接下來準備構造函數,放在public裏,構造函數與class同名。String(const char* cstr=0);給予默認值0;

  4.類內帶有指針,就要去考慮三個特殊函數:

拷貝構造(String (const String& str);)  

拷貝賦值(String& operator=(const String& str);)

析構函數(~String();)

  5.取字符串 char* get_c_str() const {return m_data;};

  6.ctor:放在class本體外來寫。

    構造函數的步驟:分配空間,轉型(編譯器),傳參。別忘記判斷傳入的是否有效。

String::String(const char* cstr = 0)
{
    if(cstr)
        {
             m_data=new char[strlen(cstr)+1];
            stcpy(m_data,cstr);
        }
    else
        {
            m_data=new char[1];
            *m_data='/0';
        }
}
  7.dtor:放在本體外來寫,儘量寫上inline

String::~String()
{
    delete[] m_data;
}
  8.copy ctor(拷貝構造)

拷貝構造就是來源端拷貝到目的端,分配空間,再拷貝,代碼如下:也希望成爲內斂函數,代碼沒加inline

String::String(const String& str)
{
    m_data=new char[strlen(str.m_data)+1];
    strcpy(m_data,str.m_data);
}
關於inline什麼時候加,什麼情況都能加,編譯器會自己判斷,沒有不好的影響。

  9.拷貝賦值

inline
String& String::operator=(const String& str)
{
    if(this==&str)
        return *this;
    delete[] m_data;
    m_data=new char[strlen(str.m_data)+1];
    strcpy(m_data,str.m_data);
    return *this;
}
關於拷貝賦值的返回值,爲什麼是String&而不是void:假設賦值語句a=b;這句話不管是String&還是void,都是沒問題,但是如果是a=b=c;那麼就會出錯。

以及String&與&str兩個&符號的含義,一個是引用,一個是取地址。在我的學習筆記有記錄:指針與引用

以及良好的習慣,需要判斷是否自我賦值,若沒有,不僅是效率問題,也可能會出錯。




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