Quiero saber que ¿por qué el nombre del constructor es siempre la misma que la del nombre de la clase y cómo se invoca implícitamente cuando se crea un objeto de esa clase. ¿Alguien puede por favor explicar el flujo de ejecución en tal situación?

Es cierto que para su etiquetado lenguajes (C++, Java, C#), pero hay otras posibilidades: En Pascal/Delphi, los constructores se han definido con el constructor la palabra clave (y puede tener cualquier nombre de método, pero por lo general es Create) y en python el constructor de la clase se llama __init__
Y en D, el constructor es llamado this.

OriginalEl autor Microsoft Developer | 2011-08-08

6 Comentarios

  1. 13

    Quiero saber que ¿por qué el nombre del constructor es siempre la misma que la del nombre de la clase

    Porque esta sintaxis no requiere de nuevas palabras clave. Aparte de eso, no hay ninguna buena razón.

    Para reducir el número de nuevas palabras clave, yo no lo uso explícito de una sintaxis como esta:

    class X {
        constructor();
        destructor();
    }

    Lugar, elegí una sintaxis de declaración que reflejaba la uso de constructores.

    class X {
        X();
        ~X();

    Esto puede haber sido demasiado inteligente. [El Diseño Y La Evolución De C++, 3.11.2 Constructor De La Notación]


    ¿Alguien puede por favor explicar el flujo de ejecución en tal situación?

    De la vida de un objeto se puede resumir así:

    1. asignar memoria
    2. llamada constructor
    3. uso de objetos
    4. llama al destructor/finalizador
    5. liberación de memoria

    En Java, paso 1 siempre asigna desde el montón. En C#, las clases son asignados por el montón así, mientras que la memoria de estructuras ya está disponible (ya sea en la pila en el caso de no ser capturado local de estructuras o dentro de su objeto primario/cierre). Nota que conocer estos detalles en general no es necesario o muy útil. En C++, la asignación de memoria es muy complicado, así que no entraré en detalles aquí.

    Paso 5 depende de cómo la memoria se asigna. La pila de la memoria se libera automáticamente tan pronto como el método termina. En Java y C#, la memoria heap es, implícitamente, editado por el Recolector de Basura en algún desconocido tiempo después de que ya no es necesario. En C++, la memoria heap es técnicamente publicado llamando delete. En C++ moderno, delete rara vez es llamada manualmente. En su lugar, debe utilizar RAII objetos tales como std::string, std::vector<T> y std::shared_ptr<T> que cuidar de sí mismos.

    D&E, por supuesto, la fuente apropiada para muchos «¿por qué no X trabajo como X?» preguntas.
    Al principio pensé que esto era un puro C++ pregunta. Pero como Java y C# son claramente influenciada por la de C++ en el caso del constructor de nombres, creo que esta es la cita es todavía relevante. Si C++ había hecho de otra manera, Java y C# probablemente habría hecho que camino, también.

    OriginalEl autor fredoverflow

  2. 6

    ¿Por qué? Porque a los diseñadores de los diferentes idiomas que mencionar decidió hacer de esa forma. Es completamente posible que a alguien para diseñar un lenguaje POO, donde los constructores no tienen que tener el mismo nombre de la clase (como se ha comentado, este es el caso de python).

    Es una forma sencilla de distinguir los constructores de otras funciones y hace que la construcción de una clase en el código muy legible, por lo que hace sentido como un lenguaje de diseño de la elección.

    El mecanismo es un poco diferente en los diferentes idiomas, pero básicamente esto es sólo una llamada de método asistido por características del lenguaje (la new palabra clave en java y c#, por ejemplo).

    El constructor se invoca por el tiempo de ejecución cada vez que se crea un nuevo objeto.

    atención al comentario?
    parece ser que hay una reciente avalancha de downvote-y-corre en el sitio…
    ni idea de por qué fue votada abajo. el sólo ‘falta’ de la cosa es un ejemplo de un diseño donde c tor es llamado por un nombre diferente (es decir, python). +1.
    pequeña corrección: Los constructores pueden ser disguished por no tener ningún tipo de devolución. Es posible tener métodos normales con el nombre de la clase (al menos en Java), pero por alguna razón que «no se recomienda»

    OriginalEl autor Oded

  3. 4

    Me parece que tener sepearte palabras clave para declarar constructor(s) sería «mejor», ya que eliminaría la otra manera innecesaria dependencia con el nombre de la clase en sí misma.

    Entonces, por ejemplo, el código dentro de la clase podría ser copiado como el cuerpo de la otra sin tener que hacer cambios con respecto a nombre del constructor(s). Por qué uno querría hacer esto no sé (posiblemente durante algún código de refactorización proceso), pero el punto es que uno siempre se esfuerza por lograr la independencia entre las cosas y aquí la sintaxis del lenguaje va en contra de eso, creo.

    Mismo para los destructores.

    Un caso de uso son las clases anónimas. Si la clase no tiene un nombre expreso, hay (por desgracia) es también no hay manera de declarar una costumbre cto r y dtor.

    OriginalEl autor user2148437

  4. 2

    Una de las buenas razones para que el constructor tiene el mismo nombre de su expresividad. Por ejemplo, en Java se crea un objeto como,

    MyClass obj = new MyClass();  //almost same in other languages too

    Ahora, el constructor se define como,

    class MyClass {
      public MyClass () {... }
    }

    Así que la declaración de arriba muy bien expresa que, va a crear un objeto y mientras este proceso el constructor MyClass() se llama.

    Ahora, cada vez que se crea un objeto, siempre llama a su constructor. Si la clase es extending algunos otros de la clase Base, entonces su constructor le llama por primera vez y así sucesivamente. Todas estas operaciones están implícitos. Primero la memoria para el objeto es asignado (en la pila) y, a continuación, llama al constructor para inicializar el objeto. Si usted no proporciona un constructor, el compilador generará uno para su clase.

    +1 para responder a la pregunta con un (omi) buena razón por la que los constructores deben tener el nombre de la clase.
    Es un poco recursivo lógica de curso: también se podría imaginar un lenguaje que dijo MyClass obj = new() // You already know the type y por lo tanto se define su cto r con class MyClass { public: new() { ... } };
    MyClass obj = new DerivedClass() también es posible :). Es por eso que no tenemos simplemente MyClass obj = new().
    new() (sin nombre de la clase) sólo puede funcionar como un acceso directo, si el tipo de referencia es el mismo que el tipo en tiempo de ejecución -, pero declaraciones como ‘Miclase obj = new MyExtendedClass()’ no será posible. Edit: ninja había
    No de debatir eso. También tenemos casos como el de foo(new myClass). Sólo estoy señalando que puedo llegar a una conclusión diferente siguiendo la misma lógica, mediante la aplicación de otra norma común (don’t repeat yourself). Como new es una palabra clave en todos estos idiomas, también es un buen cto r de nombre.

    OriginalEl autor iammilind

  5. 2

    En C++, estrictamente hablando, los constructores no tienen nombre. 12.1/1 en la norma establece que, «los Constructores no tienen nombre», no se puede pedir mucho más claro que eso.

    La sintaxis para declarar y definir constructores en C++ utiliza el nombre de la clase. Tiene que haber alguna forma de hacerlo, y utilizando el nombre de la clase es concisa y fácil de entender. C# y Java, tanto copiado C++sintaxis, presumiblemente porque sería familiar para al menos algunos de la audiencia al que se dirige.

    El flujo preciso de la ejecución depende de qué idioma está hablando, pero por lo que a las tres de la lista que tienen en común es que la primera parte de la memoria se asigna desde algún lugar (tal vez asignada dinámicamente, tal vez es alguna región específica de la memoria de pila o lo que sea). A continuación, el tiempo de ejecución es responsable de asegurar que el correcto constructor o constructores son llamados en el orden correcto, para la mayoría de la clase derivada y también clases base. Es la aplicación de cómo garantizar que esto ocurra, pero los necesarios efectos son definidos por cada uno de esos idiomas.

    De la manera más simple posible caso en C++, de una clase que no tiene clases base, el compilador simplemente emite una llamada al constructor de los especificados en el código que crea el objeto, es decir, el constructor que coincide con alguno de los argumentos proporcionados. Se vuelve más complicado una vez que usted tiene un par de virtual bases en el juego.

    OriginalEl autor Steve Jessop

  6. 1

    Quiero saber que ¿por qué el nombre del constructor es siempre el mismo ya que
    de nombre de la clase

    Por lo que puede ser unambigously identificado como el constructor.

    y cómo se invoca implícitamente cuando se crea un objeto de esa clase.

    Es invocada por el compilador, ya que ya ha sido inequívocamente identificados por su nomenclatura sheme.

    ¿Alguien puede por favor explicar el flujo de ejecución en tal situación?

    1. El nuevo X operador() es llamado.
    2. Se asigna la memoria, o se produce una excepción.
    3. Llama al constructor.
    4. El nuevo operador() devuelve al llamador.

    la pregunta es por qué los diseñadores decidieron así?

    De nomenclatura el constructor después de que su clase es un largo estipulados en el convenio que se remonta al menos hasta los primeros días de C++ en la década de 1980, posiblemente a su Simula predecesor.

    OriginalEl autor user207421

Dejar respuesta

Please enter your comment!
Please enter your name here