
#include <ctype.h>
#include <stdio.h>
#include <string.h>

//
// a String class with overloaded constructors
//
class String
    {
public:
    String(const char *s)
        {
        len = strlen(s);
        str = strcpy(new char[len + 1], s);
        }
    String(const String &s)
        {
        len = s.len;
        str = strcpy(new char[len + 1], s.str);
        }
    ~String() { delete str; }
    size_t length() { return len; }
    const char *text() { return str; }
    void cat(char c);
    char &sub(size_t i)
        {
        if (i > len)
            /* error */;
        return str[i];
        }
private:
    size_t len;
    char *str;
    };

void String::cat(char c)
    {
    char *p = strcpy(new char[len + 1], str);
    p[len++] = c;
    p[len] = '\0';
    delete str;
    str = p;
    }

int main()
    {
    size_t i;
    String s1("hello");     // s1 = "hello"
    String s2(s1);          // s2 = "hello"
    s2.cat('!');            // s2 = "hello!"
    printf("s1 = %s\n", s1.text());
    printf("s2 = %s\n", s2.text());
    for (i = 0; i < s1.length(); ++i)
        s1.sub(i) = toupper(s1.sub(i));
                            // s1 = "HELLO"
    printf("s1 = %s\n", s1.text());
    printf("s2 = %s\n", s2.text());
    return 0;
    }

