La forma más fácil de entender esto, es pensar en el objeto al que está llamando el método en el que el parámetro 0 ª:
por ejemplo: pensar en
String& MyClass::doSomething();
MyClass mc;
mc.doSomething();
como una fantasía, de manera compilador soportado de hacer esto:
String& MyClass_doSomething(MyClass *this);
MyClass mc;
MyClass_doSomething(&mc);
Ahora, la sobrecarga basado en constness es sólo un caso especial de la sobrecarga de los tipos de parámetros:
String& MyClass::doSomething();
String& MyClass::doSomething() const;
puede por el pensamiento de que algo como esto:
String& MyClass_doSomething(MyClass *this);
String& MyClass_doSomething(const MyClass *this);
En cuanto a la utilidad de esto, los ejemplos más fáciles son los métodos begin
y end
sobre diversos std::
contenedores. Si el vector
/string
/lo que no es const y llama al begin()
, obtendrá un iterator
que se puede utilizar para modificar el contenido del contenedor original.Claramente, esto no debería permitirse para los contenedores marcados const
, así que, gracias a la sobrecarga const/non const, llamando al begin()
en un vector const devuelve un const_iterator
que puede usarse para leer el contenido del vector, pero no para modificarlo.
p. Ej.
string nc = "Hello world";
for (string::iterator iString = nc.begin(); iString != nc.end(); ++iString)
{
cout << *iString;; // legal to read
*iString = toupper(*iString); // legal to write
}
const string c = "Hello world again";
for (string::const_iterator iString = c.begin(); iString != c.end(); ++iString)
{
cout << *iString;; // legal to read
// *iString = toupper(*iString); // Writing is illegal
}
En cuanto a la sobrecarga por tipo de devolución, no puede hacerlo en C++. Sin embargo, puede simulate it bastante decentemente.
¿Qué idioma estás usando? Debe etiquetar la pregunta con el idioma si desea que reciba la atención adecuada. – Oded
editado, el lenguaje que uso es C++ –
No se puede sobrecargar en el tipo de devolución en C++. – Job