自己实现一个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

posted @ 2020-04-13 21:52  Rogn  阅读(1073)  评论(0编辑  收藏  举报