#include<iostream>
#include<stdlib.h>
#include<assert.h>
using namespace std;

class String
{
public:
    String(const char* str)
        :_str(new char[strlen(str) + 1])
    {
        strcpy(_str, str);
        _size = strlen(_str);
        _capacity = _size + 1;
    }

    String(const String& s)
    : _str(NULL)   //若不赋空则为随机值,随机值_str析构函数释放指针会崩溃
    {
        String tmp(s._str);     //重新开辟空间
        swap(_str, tmp._str);
    }

    ~String()
    {
        if (_str)
        {
            delete[] _str;
            _size = 0;
            _capacity = 0;
            _str = NULL;
        }
    }
    
    //PushBack
    void PushBack(char ch)
    {
        checkcapacity();
        this->_str[_size] = ch;
        _size++;
        this->_str[_size] = '\0';
    }
    
    //popback
    /*void PopBack()
    {
        assert(_size > 0);
        --_size;
        _str[_size] = '\0';
    }*/

    char* C_str()
    {
        return _str;
    }
private:
    char* _str;
    int _size;
    int _capacity;
};

//PushBack测试函数
void Test()
{
    char* s1 = "hello";
    String s(s1);
    s.PushBack(' ');
    s.PushBack('w');
    s.PushBack('o');
    s.PushBack('r');
    s.PushBack('l');
    s.PushBack('d');
    
    cout << s.C_str() << endl;
}

//PopBack测试函数
/*void Test()
{
    String s("hello");
    s.PopBack();
    s.PopBack();
    s.PopBack();
    s.PopBack();
    
    cout << s.C_str() << endl;
}*/


int main()
{
    Test();
    system("pause");
    return 0;
}