String :: Nueva: ¿qué es?
-
28-09-2019 - |
Pregunta
Soy de un fondo de Java y está aprendiendo C ++. Me encontré con el siguiente código de C ++:
String source = String::New("'Hello' + ', World'");
Como lo entiendo hasta ahora, esto debería ser una llamada a la función miembro estática 'Nuevo' de la clase 'Cadena'. Sin embargo, he buscado a través de todo el archivo de cabecera que define 'Cadena', no hay ningún miembro estático llamado 'Nuevo' en la clase String o sus súper clases. ¿Hay algún significado especial que se atribuye a la clase String o la función de miembro nuevo en C ++?
Solución
Usted está correcto. Que está llamando el método static
New
en la clase String
.
C ++ (o STL) no tiene una clase String
nativa, hay es una clase string
, pero no tiene un método ::New
. Tendrá que asegurarse de que está leyendo la documentación correcta:)
Es posible que se hereda de una clase base, por lo que asegúrese de comprobar si String
es parte de una jerarquía de herencia.
Este es el trato con la cadena de V8. Es interesante.
Existen dos implementaciones:
- v8 :: string - el uno externamente visible (Aquí es documentación doxygen que muestra la jerarquía de clases).
- v8 :: :: string interna -. la representación interna
Navegar por interna código fuente cadena , String
es de hecho un objeto montón asignado representa una cadena Javascript.
Resulta que la interfaz de usuario de Google Code está roto (tal vez tienen un número máximo de caracteres?). La v8 :: :: código fuente interna HeapObject debe estar en src/objects.h
, pero el archivo se trunca. Y el visible externamente v8 :: cadena de código fuente debe estar en include/v8.h
, pero también se trunca.
Se puede descargar el código fuente y ver los archivos. Aquí es lo que dice:
/**
* 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);
...
};
Otros consejos
Su interpretación es correcta, se trata de una llamada a un método estático llamado New
de la clase String
.
Sin embargo, esa clase String
no es la clase std::string
estándar, ya que, como se puede ver fácilmente, se diferencia de la capitalización. Probablemente se trata de una clase String
proporcionada por alguna otra biblioteca, pero sin conocer el contexto es difícil decir algo más al respecto.
Addendum
por cierto, es el motor Javascript V8 proporcionada por Google
Bueno, he encontrado a cabo; Esa cadena que está utilizando es la representación de C ++ de una cadena de JavaScript, que se utiliza a fondo en el motor V8. Puede encontrar su código fuente aquí ; No pude encontrar ninguna documentación al respecto, pero está bien comentado.
Por cierto, si usted está acercando a C ++ es posible que desee comenzar con algo más simple, tal vez sin librerías externas, para que pueda obtener la comprensión de la biblioteca C ++ estándar.
--- --- EDITAR
Ok, otra persona lo encontró antes que yo. :)
El std::string
clase (nota minúscula) es una clase en la biblioteca estándar de C ++, que se define en el <string>
archivo de cabecera. En C ++ new
(nota minúscula) es un operador que Asigna memoria. La primera cosa que hay que estar a punto claro es - ¿qué clase string estás preguntando por