Массив символов все еще там, он просто окружен классом. Представьте себе что-то вроде этого:
class String
{
private:
char* stringData;
public:
String(const char* str)
{
stringData = new char[strlen(str)+1];
strcpy(stringData, str);
}
~String() { delete[] stringData; }
String& operator += (const String& rhs)
{
char* newStringData = new char[strlen(rhs) + strlen(stringData) + 1];
strcpy(newStringData, stringData);
strcpy(newStringData + strlen(stringData), rhs);
delete[] stringData;
stringData = newStringData;
return *this;
}
};
Это, очевидно, очень неполный пример, но вы поняли идею, верно?
Реальная реализация std :: string довольно обширна, но вы ничего не можете сделать сами. Вот некоторые отличия официального класса std :: string от того, что я написал:
- Длина строки обычно включается в качестве переменной-члена, поэтому вам не нужно постоянно вызывать strlen, чтобы найти длину.
- Класс std :: string использует шаблоны, поэтому вы не ограничены типом char. Если вы используете Unicode, вы можете использовать std :: wstring, который использует 16- или 32-битные строки, заменив тип char на тип wchar_t.
- Обычно есть много вариантов оптимизации на выбор. В последнее время наиболее популярной была оптимизация "короткой строки".
Как только вы освоитесь с C ++, попробуйте написать собственный класс строки. Это не то, что вы бы использовали на практике, но это действительно хорошее упражнение для написания библиотеки.