Listing 1

#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"
       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));
                        // s2 = "HELLO"
       printf("s1 = %s\n", s1.text());
       printf("s2 = %s\n", s2.text());
       return 0;
       }

// End of File