2012-06-05 19 views
6

He estado usando C++ y Java desde hace varios años. Una cosa que no puedo entender es por qué tenemos que dar un nombre a los constructores de una clase. Por ejemplo, si tengo que definir una clase FOO en C++/Java, me veré obligado a proporcionar FOO como el nombre del constructor. Sin embargo, dado que nunca se llama explícitamente al constructor, ¿cuál es el sentido del compilador que me obliga a darle un nombre después de todo?¿Cuál es el sentido de dar nombres a los constructores?

El paradigma de la abstracción dicta que ocultamos detalles innecesarios de los programadores. Esta es la razón, los constructores no tienen un tipo de devolución, ya que ya está bien definido lo que un constructor debe devolver. En el mismo espíritu, ¿por qué no podemos simplemente dar un nombre genérico a los constructores de todas las clases? Por ejemplo, cualquier cosa significativa, como initialize() o tal vez nada y solo argumentos ([arg [,arg]])

Espero, soy capaz de expresarme . Si alguien tiene alguna respuesta definitiva, hágamelo saber.

+0

Como nota al margen interesante, PHP tiene un nombre genérico para los constructores '__construct' – xbonez

+2

Esta pregunta encaja mejor en [Programadores] (http://programmers.stackexchange.com/). –

+1

+1 por pensamiento radical !! – WickeD

Respuesta

2

Desde el estándar de C++ (12.1) (el subrayado es mío):

Constructores no tienen nombres. Una sintaxis especial del declarador se usa para declarar o definir el constructor. El sintaxis utiliza:

  • una decl-especificador-seq opcional en la que cada decl-especificador es o bien una función de especificador de o constexpr,
  • nombre de la clase del constructor, y
  • una lista de parámetros

En C++, no está proporcionando un nombre, está escribiendo una sintaxis especial que fue decidida por los creadores del lenguaje para declarar un constructor.

+0

Sí, lo sé. Pero aún así, desde una perspectiva de diseño del lenguaje, no es óptimo tener esta sintaxis aplicada. Entiendo completamente que los constructores no serán representados como otros métodos, que su nombre es descartado, pero aún tener que hacer un trabajo extra parece tedioso. Imagine una clase donde tenemos 10 versiones sobrecargadas. Una notación concisa hubiera sido una mejor opción de diseño. – VaidAbhishek

+1

@VaidAbhishek: Eso puede debatirse. En C++, C# y Java, se usa el nombre de la clase. Personalmente creo que es la forma más lógica. –

+0

@VaidAbhishek: ¿Es realmente una tarea tan onerosa copiar/pegar el nombre de clase una vez por cada constructor y destructor? – Blastfurnace

-2

dado que no se puede llamar al constructor explícitamente, ¿para qué darle un nombre especial? y sobre constructores que tienen un nombre igual al de la clase: la construcción solo se puede realizar en una función, por lo que el constructor es una función. y dado que es una función especial, entre otras funciones de clase, debe tener una firma especial. los diseñadores de idiomas querían que se los nombrara con la clase.

1

es un estándar para el idioma, si desea tener un nombre genérico para el constructor, intente aprender otro idioma o tal vez cree su propio idioma. = p

+2

Esperando 125 puntos de reputación. – VaidAbhishek

0

Los constructores son funciones especiales y el constructor siempre devuelve la dirección de memoria creada por el operador 'nuevo'. Dado que una función devuelve solo una cosa a la vez, no puede devolver ningún otro valor desde el constructor. Es el estándar de Java para definir un nombre de constructor igual que el nombre de clase.

+0

Entiendo la semántica, pero mi pregunta es sobre el nivel de diseño. ¿Por qué obligar a un programador a definir un nombre después de todo? Creo que no entendiste mi pregunta. – VaidAbhishek

0

Primero, no tiene que escribir un constructor. si no escribe uno, el compilador creará un constructor predeterminado para usted.

segundo, a veces tiene que usar uno (por ejemplo, si tiene variables de clase finales, deben inicializarse al crear el objeto). En este caso, debe escribir un constructor y lo usará cuando cree una instancia del objeto.

public class Foo { 
    final int a; 

    public Foo (int val){ 
     this.a = val 
    } 
} 

Foo foo = new Foo (23); 
3

En constructores ++ C no tienen nombres (C++ 03 12.1), sin embargo, desde constructores se definen esencialmente como funciones, era lógico que los nombre de alguna manera.
Al darles un nombre distinto del nombre de la clase, se agregaron nuevas palabras clave y, por lo tanto, finalmente se las denominó igual que el nombre de la clase.
En resumen, fue una decisión lógica que evitó nuevas palabras clave y al mismo tiempo garantizó la intuición.

+0

Sí, tienes razón. Pero aquí estoy hablando de no agregar palabras clave adicionales, sino simplemente para eliminar una restricción, que parece un detalle innecesario. Por ejemplo, alguien mencionó que en PHP tenemos una notación __construct, para definir un constructor, que es común en todas las clases. En python también tenemos la palabra clave __init__ para definir una funcionalidad de constructor. Estos nombres hacen que el constructor emerja más explícito en su significado. De todos modos, creo que es una decisión de diseño y tal vez se puede mejorar en futuras versiones.Estaba reflexionando sobre eso y decidí solicitar opiniones al respecto. – VaidAbhishek

+1

@VaidAbhishek: Los ejemplos de idiomas que citó añaden nuevas palabras clave. Cuando se diseñó C++, hubo un esfuerzo consciente para mantener las palabras clave al mínimo, por lo que el uso de una nueva palabra clave sería una sobrecarga. ** No hay restricción específica **. Otro lenguaje te obligaría a usar una palabra clave, C++ te obliga a usar el nombre de clase (* en el proceso no inventando una nueva palabra clave *). Además, cada idioma está diseñado con una gramática del lenguaje específica. No se pueden discutir aspectos de esta gramática , es simplemente porque el diseñador así lo quiso. –

+0

C++ necesitaría más de un nombre. Los constructores de copiadores y destructores tampoco tienen nombres actualmente. Pero seamos realistas: cualquier IDE decente puede usar códigos de colores. Ver un nombre de clase coloreado como nombre de función es una pista visual clara de que está tratando con el ctor. – MSalters

1

Para Java y C++, el nombre del constructor debe ser el mismo que el nombre de la clase. Además, sabes que es un constructor, porque no declara un tipo de devolución. Esta forma de declarar un constructor le ayuda a declarar un método cuyo nombre es __init__, initialize o __constructor. Esto no es posible en Python, por ejemplo, porque usa __init__ como nombre de constructor.

0

Tiene razón en su línea de pensamiento. La sintaxis que Java adoptó es solo un artefacto histórico.

En los idiomas más nuevos que admiten OOP, esta redundancia generalmente no existe. Scala llama this *, F # llama new *, Python lo invoca __init__, Ruby llama initialize etc.


* constructores auxiliares de todos modos. Los constructores primarios en estos lenguajes son los propios argumentos de clase.

Cuestiones relacionadas