De acuerdo con las respuestas a this subproceso, operator=
no se puede sobrecargar como una función no miembro. Entonces, por ejemplo, lo siguiente hace que el compilador se enoje mucho:Operador sobrecarga = como No miembro
class MyClass
{
// ...
};
MyClass& operator=(MyClass& Left, MyClass& Right)
{
// ...
}
¿Por qué es esto? Tengo una clase de contenedor con getters y setters, por lo que una función miembro es innecesaria y rompería la encapsulación. Una de las respuestas al hilo antes mencionado dice que es para asegurarse de que el "valor L se reciba como su primer operando", pero no entiendo completamente lo que eso significa. ¿Podría alguien aclarar?
Además, son operator=
, operator()
, operator[]
y operator->
casos "bicho raro" ...? ¿O debería implementar todos los operadores sobrecargados como funciones miembro ...? (Sé que es perfectamente legal hacer lo contrario, pero estoy buscando la mejor práctica.)
Ver también este hilo http://stackoverflow.com/questions/3938036/rationale-of-enforcing-some-operators-to-be-members – UmmaGumma
Creo que los getters/setters rompen el encapsulamiento más que un operador de asignación. Nota: Si no define uno, su clase ya tiene un operador de asignación. Intentalo. –
Las funciones de miembro no rompen la encapsulación; ellos son parte de eso La preferencia de crear "funciones no miembro, no amigo" puede dar como resultado clases más simples, pero en el caso general, exponer todo lo necesario para implementar operator =() es más probable que debilite la encapsulación que hacer que operator =() sea un miembro. –