Как создается строковый тип в c ++? - PullRequest
0 голосов
/ 26 июля 2011

Как был создан тип "string" в C ++?В C строки - это символьные массивы, но как C ++ превратил массивы символов в «строки», известные нам в C ++?

Ответы [ 3 ]

8 голосов
/ 26 июля 2011

Массив символов все еще там, он просто окружен классом. Представьте себе что-то вроде этого:

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 ++, попробуйте написать собственный класс строки. Это не то, что вы бы использовали на практике, но это действительно хорошее упражнение для написания библиотеки.

3 голосов
/ 26 июля 2011

Путем написания класса, который инкапсулирует множество строковых функций, и путем перегрузки множества операторов.

строка действительно является просто классом, как любой другой:

 string s = "hello"

являетсяОпределена перегрузка оператора равенства:

 string& operator= ( const char* s );

, например.

0 голосов
/ 26 июля 2011

Это просто класс с именем 'string', что-то вроде этого:

class string
{
private:
    //members
    char* c;
public:
    //methods
    bool operator==(const string& other) const;
};
...