天天看點

String字元串類實作

1、

class String
{
public:
    String(const char *str = null);//普通構造函數
    String(const String& other);//拷貝構造函數
    ~String();//析構函數
    String& operator = (const String& other);//指派函數
    String(String&& other);//移動構造
    String& operator = (String&& other);//移動指派

private:
    char *m_data;
};
           

2、構造函數

String::String(const char *str)
{
    if(str == NULL)
    {
        m_data = new char[];
        *m_data = '\0';
    }
    else
    {
        m_data = new char[strlen(str)+];
        strcpy(m_data,str);
    }
}
           
string str("hell0");
           

3、析構函數

String::~String()
{
    delete [] m_data;
}
           

4、拷貝構造

String::String(const String &other)
{
    m_data = new char[strlen(other.m_data)+];
    strcpy(m_data,other.m_data);
}
           
string s1("hello");
string s2=s1;
           

5、拷貝指派

String& String::operator=(const String &other)
{
    //檢查自指派
    if(this == &other)
        return *this;
    delete[] m_data;//釋放原有記憶體資源
    m_data = new char[strlen(other.m_data)+];
    strcpy(m_data,other.m_data);
    return *this;//傳回本對象的引用
}
           
string s1("hello");
string s2;
s2 = s1;
           

6、移動構造

String(String&& other):m_data(nullptr)
{
    m_data = other.m_data;
    other.m_data = nullptr;
}
//或者借用move()
String(String&& other):m_data(std::move(other.m_data))
{
} 
           

7、移動指派

String& operator = (String&& other)
{
    if(this!=&other)
    {
        delete[] m_data;
        m_data = other.m_data;
        other.m_data = nullptr;
    }
    return *this;
}
//或者借用move()
String& operator = (String&& other)
{
    m_data = move(other.m_data);
    return *this;
}
           

8、指派操作符的

如果不加const的話:
string s3("pello");
const string s4("qello");
s3 = s4;
這樣就會,因為一個 const 變量不能随意轉化成非const變量

另外,
string s7("pello");
string s8("pellp");
string s9("qellp");
s9 = s7+s8;
不用const 會報錯,因為 + 指派必須傳回一個操作值已知的string對象 ,除非他是一個const對象