c++ - teorico - ¿El operador+, diferencia entre los tipos de clase y los tipos incorporados?
manual completo de c++ pdf (2)
No devuelve un lvalue modificable para la cadena. Devuelve un objeto temporal, y s1+s2
y x+y
son ambos valores.
Sin embargo, los objetos de tipo de clase pueden tener un operator=
sobrecargado operator=
, lo que hace la string
. Se le permite llamar a funciones miembro en rvalues.
La diferencia entre los dos casos está en =
(no +
)
Soy nuevo en C ++. El libro que leí me dice que si el operador más ( +
) se ha sobrecargado para algún objeto de clase, por ejemplo, la clase de string
, para hacer este problema más concreto.
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1("abc");
string s2("def");
string s3("def");
cout<<(s1+s2=s3)<<endl;
int x=1;
int y=2
int z=3;
cout<<(x+y=z)<<endl;
return 0;
}
Como puede esperar, la primera declaración de cout
es correcta, mientras que la segunda es incorrecta. Las quejas del compilador x+y
no es un lvalor modificable. Mi pregunta es ¿por qué el operador +
devuelve un lvalue modificable para string
objetos de string
pero no para int
?
Para std::string
, s1 + s2 = s3
es de hecho:
(operator+(s1, s2)).operator =(s3)
s1 + s2
devuelve un rvalor
Los métodos de los miembros pueden aplicarse también a los temporales.
Desde C ++ 11, tenemos el calificador lvalue / rvalue para el método,
por lo que puede prohibir o1 + o2 = o3
para su tipo personalizado con:
struct Object
{
Object& operator =(const Object& rhs) & ; // Note the & here
};
por lo tanto, Object::operator =
solo se puede aplicar a lvalue.