String :: New: что это? - PullRequest
       42

String :: New: что это?

4 голосов
/ 18 июня 2010

Я из Java и изучаю C ++. Я столкнулся со следующим кодом C ++:

String source = String::New("'Hello' + ', World'"); 

Как я понимаю, это должен быть вызов статической функции-члена 'New' класса 'String'. Но я просмотрел весь заголовочный файл, определяющий 'String', в классе String или его суперклассах нет статического члена с именем 'New'. Есть ли какое-либо особое значение, связанное с классом String или функцией-членом New в C ++?

Ответы [ 3 ]

17 голосов
/ 18 июня 2010

Вы правы.Это вызывает метод static New в классе String.

C ++ (или STL) не имеет собственного класса String, там равен a *Класс 1009 *, но у него нет метода ::New.Вы должны убедиться, что читаете правильную документацию:)

Возможно, он унаследован от базового класса, поэтому убедитесь, что вы проверяете, является ли String частью иерархии наследования.

Вот сделка со строкой v8.Это интересно.

Есть две реализации:

Просмотр внутреннего исходного кода String , String действительно является объектом, выделенным в куче, представляющим строку Javascript.

Оказывается, пользовательский интерфейс Google Code не работает (возможно, у них максимальное количество символов?).Исходный код v8 :: internal :: HeapObject должен быть в src/objects.h, но файл урезан.И видимый извне v8 :: String исходный код должен быть в include/v8.h, но он тоже усекается.

Вы можете скачать исходный код и просмотреть файлы.Вот что он говорит:

/**
 * A JavaScript string value (ECMA-262, 4.3.17).
 */
class V8EXPORT String : public Primitive {
 public:
   ...

 /**
   * Allocates a new string from either utf-8 encoded or ascii data.
   * The second parameter 'length' gives the buffer length.
   * If the data is utf-8 encoded, the caller must
   * be careful to supply the length parameter.
   * If it is not given, the function calls
   * 'strlen' to determine the buffer length, it might be
   * wrong if 'data' contains a null character.
   */
  static Local<String> New(const char* data, int length = -1);

  /** Allocates a new string from utf16 data.*/
  static Local<String> New(const uint16_t* data, int length = -1);

  ...
};
5 голосов
/ 18 июня 2010

Ваша интерпретация верна, это вызов статического метода с именем New класса String.

Однако этот класс String не является стандартным классом std::string, поскольку, как вы можете легко видеть, он отличается заглавными буквами. Вероятно, это класс String, предоставляемый какой-то другой библиотекой, но без знания контекста сложно что-либо сказать об этом.

<ч />

Добавление

Кстати, это движок Javascript v8, предоставленный Google

Хорошо, я узнал; та строка, которую вы используете, является представлением C ++ строки JavaScript, которая полностью используется в движке V8. Вы можете найти его исходный код здесь ; Я не смог найти никакой документации об этом, но это хорошо прокомментировано.

Кстати, если вы только приближаетесь к C ++, возможно, вы захотите начать с чего-то более простого, может быть, без внешних библиотек, чтобы вы могли понять стандартную библиотеку C ++.

--- EDIT ---

Хорошо, кто-то еще нашел это до меня. :)

1 голос
/ 18 июня 2010

Класс std::string (обратите внимание на нижний регистр) - это класс в стандартной библиотеке C ++, определенный в заголовочном файле <string>. В C ++ new (обратите внимание на строчные буквы) есть оператор, который выделяет память. Первое, что вам нужно прояснить, - о каком классе строк вы спрашиваете?

...