2010-06-16 12 views
8

Acabo de encontrar varios métodos de sobrecarga como tipo de parámetro pasado, número variable de parámetros, tipo de retorno, etc. Solo quiero saber que puedo sobrecargar una función con las siguientes dos versionesPuede sobrecargar es posible con dos versiones de función, función de miembro constante y función sin const

 

//function which can modify member 
String& MyClass::doSomething(); 

//constant member function 
String& MyClass::doSomething() const; 

Háganme saber la razón detrás de ello.

+0

¿Qué idioma estás usando? Debe etiquetar la pregunta con el idioma si desea que reciba la atención adecuada. – Oded

+0

editado, el lenguaje que uso es C++ –

+0

No se puede sobrecargar en el tipo de devolución en C++. – Job

Respuesta

9

Sí, puedes.

Si tiene

MyClass m; 
m.doSomething(); 

se llama La versión no const. Cuando tenga

const MyClass m; 
m.doSomething(); 

Se llamará a la versión const.

2

Sí, puedes hacer esto. (@Job, esto no es sobrecarga en el tipo de retorno, esto es sobrecarga en 'const-state' de la instancia de clase llamada)

Si la instancia es const, se llamará a la segunda variante, si no es , el primero se llama. El uso práctico es que si el método se llama en una instancia const, es probable que también desea devolver una "cadena const &" (por ejemplo, si devuelve una referencia a un miembro de la clase), así:

//function which can modify member 
String& MyClass::doSomething(); 

//constant member function 
const String& MyClass::doSomething() const; 
+0

Sé que la pregunta no era sobre la sobrecarga en el tipo de devolución, pero mencionó en su pregunta que pensó que esto era posible. – Job

1

Esto no solo es posible, sino que es una expresión común.

Por ejemplo, si se llama a la versión const de una función, se puede devolver una referencia a una versión de solo lectura de un resultado. Pero si se llama a la versión que no es const, se construye y devuelve una copia que el receptor puede modificar. Al implementar una versión const, nos salvan de realizar la construcción cuando sabemos que no va a ser necesaria.

3

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.

2

Así es como se usa el iterador. Usted tiene un iterador const así como uno no const.

Cuestiones relacionadas