The below is a C++ implementation of a very basic string class, meant to illustrate the concept. It encapsulates much of the common used functionality of the str functions, but is by no means complete.

Example usage:

MyString str1 = "Foobar";
MyString str2 = str.Slice(1,3);
// str2 now contains "Foo"
MyString str3 = str2;
// str3 now equals str 2.
MyString str4 = str2 + str1;
// str4 now contains "FooFoobar"
MyString str5 = "FooFoobar";
if ( str5 == str4 ) cout << "str5 == str4";
cout << str5[1]; // outputs "o"


class MyString {
  public:
    char *data;
    MyString();
    MyString(MyString& rhs);
    MyString(const char* rhs);
    ~MyString();
    MyString& operator+(const MyString& rhs);
    MyString& operator=(const MyString& rhs);
    MyString& operator=(const char* rhs);
    char operator[](int Index);
    char *Slice(int from, int offset);
    operator char *() const { return data; }
    bool operator==(const MyString& rhs);
    char* CString();
    size_t Strlen();
};

MyString::MyString() {
  data = 0;
}

MyString::MyString(MyString& rhs ) {
  data = new char[rhs.Strlen()];
  strcpy(data,rhs.data);
}

MyString::MyString(const char* rhs) {
  if (! rhs ) {
    data = 0;
    return;
  }
  data = new char[strlen(rhs)];
  strcpy(data,rhs);
}

MyString::~MyString() {
  delete[] data;
}

MyString& MyString::operator+( const MyString& rhs ) {
  MyString* NewString = new MyString;
  NewString->data = new char[strlen(rhs.data)+strlen(data)];
  strcpy(NewString->data,data);
  strcat(NewString->data,rhs.data);
  return *NewString;
}

MyString& MyString::operator=( const MyString& rhs ) {
  if ( rhs == *this ) // assignment to self is bad!
    return *this;

  strcpy(data,rhs.data);
  return *this;
}

bool MyString::operator==( const MyString& rhs ) {
  if ( strcmp(rhs.data, data) == 0 )
    return true;
  return false;
}

MyString& MyString::operator=(const char* rhs) {
  if ( rhs == data )
    return *this;
  strcpy(data,rhs);
  return *this;
}

char MyString::operator[](int index) {
  if ( index > Strlen() || index < 0 )
    return 0;
  return data[index];
}

char *MyString::Slice(int from, int offset) {
  size_t size = Strlen();
  size_t SizeOfSlice = offset;
  if ( from + offset > size || from + offset < 0  )
    return 0;
  char *New = new char[SizeOfSlice];
  char *DataIter = data + from;
  for (int i = 0; i < SizeOfSlice; i++ ) {
    *New++ = *DataIter++;
  }
  *New = '\0';
  return (New-SizeOfSlice);
}

size_t MyString::Strlen() {
  return strlen(data);
}

char *MyString::CString() {
  return data;
}