自己實現一個String類(C++)


C++默認的拷貝構造函數和賦值構造函數都是淺拷貝,所以當遇到成員含有指針變量時,需要自己實現深拷貝。

寫個簡單的String就是很好的例子。

#include<bits/stdc++.h>
using namespace std;

class String{
public:
    // 默認構造函數
    String(const char* str = nullptr);
    // 拷貝構造函數
    String(const String& str);
    // 析構函數
    ~String();
    // 字符串賦值函數
    String& operator= (const String& str);

    char* getStr()
    {
        return this->data;
    }
private:
    char* data;
    int size;
} ;

// 構造函數
String::String(const char* str)
{
    if(str == nullptr)  // 加分點
    {
        data = new char[1];
        data[0] = '\0';
        size = 0;
    }
    else
    {
        size = sizeof(str);
        data = new char[size+1];
        strcpy(data, str);
    }
}

// 拷貝構造函數
String::String(const String& str)
{
    size = str.size;
    data = new char[size+1];
    strcpy(data, str.data);
}

// 析構函數
String::~String()
{
    delete[] data;
}

String& String::operator=(const String& str)
{
    if(this == &str)  return *this;   // 得分點:檢查自賦值

    delete[] data;      // 得分點:釋放原有空間
    size = str.size;
    data = new char[size+1];
    strcpy(data, str.data);
    return *this;
}

int main()
{
    char* s = "hello";
    String* testStr = new String("12345");
    String* testStr2 = new String(s);
    String testStr3(*testStr2);
    String testStr4 = testStr3;
    String testStr5 = std::move(testStr4);  // move()可以將值轉化成右值
    cout << testStr->getStr() << endl;
    cout << testStr2->getStr() << endl;
    cout << testStr3.getStr() << endl;
    cout << testStr4.getStr() << endl;
    cout << testStr5.getStr() << endl;
}

 

 

參考鏈接:https://zhuanlan.zhihu.com/p/62290636


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM