#include <iostream>
using std::cout;
using std::endl;

#include <cstring>

struct String
{
    char    *buf;
    size_t  len;

    String()
    {
        len = 0U;
        buf = new char[1U];

        *buf = '\0';
    }

    String( const char *cstr )
    {
        len = strlen( cstr );

        buf = new char[len + 1U];

        memcpy( buf, cstr, len + 1U );
    }

    String( const String &str )
    {
        len = str.length();

        buf = new char[len + 1U];

        memcpy( buf, str.buf, len + 1U );
    }

    String &operator=( const String &rhs )
    {
        if( this != &rhs )
        {
            this->~String();

            len = rhs.length();

            buf = new char[len + 1U];

            memcpy( buf, rhs.buf, len + 1U );
        }

        return *this;
    }

    String operator+( const String &rhs ) const
    {
        String  tmp;

        tmp.~String();

        tmp.len = this->length() + rhs.length();
        tmp.buf = new char[tmp.len + 1U];

        memcpy( tmp.buf, this->buf, this->length() + 1U );
        strcat( tmp.buf, rhs.buf );

        return tmp;
    }

    size_t length() const
    {
        return len;
    }

    ~String()
    {
        delete [] buf;

        len = 0U;
    }
};


int main()
{
    String  s1( "123" );
    String  s2;
    String  s3 = s1 + s2 + "789";
    String  s4;

    s2 = "456";
    s4 = s3 + "0";

    cout << s1.buf << endl;
    cout << s2.buf << endl;
    cout << s3.buf << endl;
    cout << s4.buf << endl;

    return 0;
}
