2011-11-04 10 views
6

¿Puedo escribir arbitrariamente una función operator+() para la clase string de C++ entonces no tengo que usar <sstream> para concatenar cadenas?¿Es posible crear un operador + función para la clase de cadena de C++? Y para concatenar "literales"?

Por ejemplo, en lugar de hacer

someVariable << "concatenate" << " this"; 

¿Puedo añadir un operator+() por lo que puedo hacer

someVariable = "concatenate" + " this"; 

?

+3

'+' operador por defecto concatena std :: cadena. ¿Qué nuevo estás tratando de hacer? [operador + documentación] (http://www.cplusplus.com/reference/string/operator+/) – Mahesh

+0

Aaah. Me lo perdí. Eso no apareció en ninguno de los mejores resultados para "cadena de concatenación de C++". Entonces, ¿eso funciona con literales? – trusktr

+0

No. Para que el operador '+' funcione al menos un operando debe ser de tipo 'std :: string'. En su caso, ambos son de tipo 'const char *' como dijo @AusCBloke. – Mahesh

Respuesta

15

El std::stringoperator+ hace concatenar dos std::string s. Sin embargo, su problema es que "concatenate" y "this" no son dos std::string s; son del tipo const char [].

Si desea concatenar los dos literales "concatenate" y "this" por cualquier razón (por lo general por lo que se puede dividir cadenas a través de múltiples líneas) que hace:

string someVariable = "concatenate" " this"; 

y el compilador dará cuenta de que en realidad se quiere string someVariable = "concatenate this";


Si "concatenate" y "this" se almacena en std::string s entonces la siguiente es válida:

string s1 = "concatenate"; 
string s2 = " this"; 

string someVariable = s1 + s2; 

O

string s1 = "concatenate"; 

string someVariable = s1 + " this"; 

O incluso

string someVariable = string("concatenate") + " this"; 

Dónde " this" habrá automáticamente convertidos en un objeto std::string cuando operator+ se invoca. Para que esta conversión tenga lugar al menos uno de los operandos debe ser ser del tipo std::string.

+0

@NicolBolas gracias por la edición, estaba pensando en agregarla. – AusCBloke

+0

Ah, vale, creo que lo entiendo: el operador + solo funciona cuando hay al menos un 'estándar :: string' siendo "agregado" con un literal. ¿Funciona si hago 'string someVariable = s1 +" this "+" que ";'? (También actualicé mi pregunta.) – trusktr

+0

@trusktr sí lo hace, porque la declaración se equipara de izquierda a derecha, es decir. '(s1 +" this ") +" that ";'. Entonces '" this "' se concatenará al resultado de '(s1 +" this ")', que es de tipo 'std :: string'. – AusCBloke

Cuestiones relacionadas