una que programacion poo orientada objetos miembros metodos metodo ejemplos codigo clases clase atributos c++ ambiguity ambiguous-call

c++ - que - ¿Qué sucede cuando una clase y una función tienen el mismo nombre?



que es un metodo en poo (3)

#include <iostream> using namespace std; struct test { test(){cout<<"class"<<endl;} }; void test(){cout<<"function"<<endl;} int main() { test(); return 0; }

Salida:

function

(VS2013 ang gcc 4.8.1)

¿Por qué se selecciona la función? ¿No es ambigüedad?


De N3485 §3.3.10 [basic.scope.hiding] / 2:

Un nombre de clase (9.1) o un nombre de enumeración (7.2) puede estar oculto por el nombre de una variable, miembro de datos, función o enumerador declarado en el mismo ámbito.

Por lo tanto, la función tiene prioridad sobre la clase.

Como se mencionó en los comments , la clase todavía es accesible a través de la palabra clave class o struct . Si la clase tuviera prioridad, la función sería inalcanzable.


Esto se llama ocultar nombre y se describe en

3.3 Alcance [basic.scope]

3.3.1 Regiones declarativas y ámbitos [basic.scope.declarative]

4) Dado un conjunto de declaraciones en una sola región declarativa, cada una de las cuales especifica el mismo nombre no calificado,
- todos se referirán a la misma entidad, o todos se referirán a funciones y plantillas de funciones; o
- exactamente una declaración declarará un nombre de clase o un nombre de enumeración que no sea un nombre typedef y las demás declaraciones se referirán a la misma variable o enumerador, o todas se referirán a funciones y plantillas de funciones; en este caso, el nombre de la clase o el nombre de la enumeración está oculto (3.3.10). [...]

énfasis mio

Tenga en cuenta que cambiar el orden de la declaración no afecta el resultado:

void test(){cout<<"function"<<endl;} struct test { test(){cout<<"class"<<endl;} }; int main() { test(); return 0; }

Todavía imprime la function .

En caso de que no sea obvio, no hagas esto :)


No estoy seguro de que alguna de las respuestas anteriores sea el "por qué" de su instancia en particular.

No me malinterpretes Son verdaderos y precisos.

Sólo creo que es más simple.

En tu ejemplo, nunca creas una instancia de la estructura.

En otras palabras, lo declaraste, pero nunca lo usaste.

Como nunca lo has referenciado, nunca se llama.

La precedencia del nombre y tal no se aplican aquí, ya que nunca se ha creado una instancia de la estructura.

Espero que esto ayude,

-Juan