Esta es una pregunta muy básica, la busqué pero solo quiero preguntarle a esta comunidad que tenemos tanto constructors
como . Pero normalmente usamos constructor para inicializar las variables en lugar de los métodos. Creo que ambos pueden usarse para inicializar variables. Entonces, ¿cuál es la diferencia básica entre ambos? ¿Hay alguna razón sólida? esta es una pregunta muy básica, así que tenlo por el bien del nivel de principiante. gracias de antemano ..¿Por qué se usa constructor en lugar de funciones?
Respuesta
La diferencia más importante: cuando crea una instancia de un objeto, se invoca su constructor mientras que llamar a un método siempre es opcional. Por lo tanto, puede olvidarse de llamar a su método de inicialización y no puede inicializar todo correctamente.
Por ejemplo, todas estas formas normales de crear instancias de un objeto va a llamar al constructor
Foo* p = new Foo();
Foo p;
O si tiene argumentos obligatorios, no defina un constructor por defecto y en lugar de requerir la construcción con parámetros:
class Foo
{
private:
Foo();
public:
Foo(int param1, double param2)
};
Esto tiene la ventaja de requerir los argumentos antes de instanciar la clase. Por lo que está obligado a hacer:
Foo* p = new Foo(1, 5.0);
y en su defecto construir con argumentos válidos se convierte en un error de compilación:
Foo* p = new Foo(); // compiler error
así que siempre que sea posible, siempre errar en el lado de hacer su inicialización en un constructor . Hay algunos casos en los que un constructor puede no ser viable. Por ejemplo, la única manera de fallar un constructor es mediante el uso de una excepción. La falla en la construcción puede ser "rutinaria" y no verdaderamente excepcional. También las excepciones pueden ser costosas en algunas arquitecturas. Otro caso podría ser cuando desee asegurarse de que los métodos virtuales estén completamente vinculados, lo que se garantiza que será cierto solo después de la construcción.
No se pueden usar ambos para inicializar las variables de miembro. Es el trabajo del constructor inicializar miembros, y se llama automáticamente cada vez que creas una nueva instancia.
considerar lo siguiente:
class Foo {
public:
// Constructor
Foo() : x(53) // Initialise x
{}
void bar() {
x = 42; // Error, attempt to *assign* a const member!
}
private:
const int x;
};
Sin el constructor, no habría manera de inicializar miembro de x
.
Que está todo bien hasta que tenga que devolver un código de error en tiempo de ejecución. : P – chrisaycock
@chrisaycock: Touché. Pero siempre hay excepciones ... –
+1 por su buena respuesta. Gracias a su argumento, le dio fuerza a la mente para hacer una manera clara sobre los constructores. –
El constructor se invoca automáticamente cuando crea el objeto a diferencia de una función. Además, el constructor se usa para indicar la intención de que esto sea para la inicialización del objeto.
Imagine que tiene una variable miembro que no tiene un constructor vacío. Entonces no tiene otra opción más que inicializarla en la lista de inicializadores de su constructor.
También se llama al constructor cuando se asigna una matriz con el nuevo operador, mientras que la inicialización con métodos hará que el código sea más complicado.
En general, tener una lógica compleja en el constructor no es una buena idea, pero se debe hacer una inicialización simple allí (lo que necesita hacer para asegurarse de que su objeto esté en algún estado válido).
Los constructores se llaman automáticamente, por lo que no hay necesidad de preocuparse si el usuario ya ha invocado un método de inicialización. Sin embargo, el Google style guide does have something to say about constructors:
- No hay manera fácil para los constructores para señalar errores, a falta de uso de excepciones.
- Si el trabajo falla, ahora tenemos un objeto cuyo código de inicialización falló, por lo que puede ser un estado indeterminado.
- Si el trabajo llama a funciones virtuales, estas llamadas no se enviarán a las implementaciones de la subclase. La modificación futura de su clase puede introducir silenciosamente este problema incluso si su clase no está actualmente subclasificada, lo que causa mucha confusión.
- Si alguien crea una variable global de este tipo, se llamará al código del constructor antes de main(), posiblemente rompiendo algunas suposiciones implícitas en el código del constructor.
La recomendación de Google es tener una iniciación directa en un constructor y una iniciación no trivial en un método diferente.
Lo cual está muy bien, a menos que seas un fanático de los objetos inmutables. –
El principal argumento para seguir la guía de estilo de C++ de Google parece ser el nombre grande.No me gusta su opinión sobre (no) usar excepciones. Si no usa excepciones, está usando un estilo muy similar a C de C++. Un conocido experto en C++ dijo una vez: http://www2.research.att.com/~bs/3rd_safe0.html Para responder a su lista con viñetas: (1) luego solo use excepciones (acaba de descubrir que hay esencial para usar constructores/RAII) (2) de nuevo, no tendrá un objeto no válido si lanza una excepción (3) Estoy de acuerdo, pueden surgir algunos problemas desagradables, el compilador debería advertirle. (4) entonces, ¿no hay código en constructores? – Andre
Inicializar variables es, sin duda, una práctica de programación muy importante. cuando se usan clases, la opción es inicializarlas dentro de los métodos. Por lo tanto, tenemos dos pasos: -
- definir el método
- Llame al método para realizar la inicialización
Pero si se olvida el 'llamado de método', las variables acaban teniendo los valores de la chatarra . Para hacer la vida más fácil para el programador, el concepto de un método constructor fue traído en
con los constructores, que sólo tienen un paso: -.
- Definir el constructor
La 'parte llamando' es se realiza automáticamente cada vez que se crea un nuevo objeto de la clase.
Los constructores se pueden utilizar para una gestión eficiente de la memoria, lo cual no es posible con las funciones.
Destructor se puede utilizar para destruir los constructores cuando no sea necesario.
Además, se sabe que el uso del constructor de copias evita dificultades o errores debido a errores de memoria.
- 1. ¿Por qué la clase Java Pattern usa un método de fábrica en lugar de un constructor?
- 2. ¿Por qué se llama este constructor de copia en lugar de mover el constructor?
- 3. ¿Por qué se llama al constructor de copia en lugar del constructor de conversión?
- 4. ¿Por qué OpenGL usa grados en lugar de radianes?
- 5. ¿Por qué PHP 5 usa __contruct() en lugar de className() como constructor?
- 6. ¿Por qué RTP usa UDP en lugar de TCP?
- 7. ¿Por qué usa Forth IF ENTONCES ... en lugar de ENDIF?
- 8. ¿Por qué la doctrina usa DONDE EN lugar de LÍMITE?
- 9. ¿Por qué el cacao usa delegados en lugar de herencia?
- 10. ¿por qué usa el movl en lugar de push?
- 11. ¿Por qué Ruby usa responder_a? en lugar de responde_ a?
- 12. ¿Por qué UnderscoreJS usa toString.call() en lugar de typeof?
- 13. ¿Por qué se usa console.log? ¿Qué hace?
- 14. ¿por qué se usa osgi?
- 15. ¿Por qué se usa suhosin?
- 16. ¿Por qué # 'se usa antes de lambda en Common Lisp?
- 17. io_service, ¿por qué y cómo se usa?
- 18. ¿Por qué se usa NSUserDefaults en iOS?
- 19. ¿Por qué se usa 1103515245 en rand?
- 20. ¿Qué es LiteralControl? ¿Por qué se usa?
- 21. ¿Para qué se usa realmente la propiedad `constructor`?
- 22. ¿Por qué el constructor de IPAddress toma Int64 en lugar de UInt32?
- 23. ¿Por qué md5 todavía se usa ampliamente?
- 24. ¿Por qué no se llama al constructor cuando() se usa para declarar un objeto?
- 25. ¿Por qué Java ArrayList usa conversión por elemento en lugar de conversión por matriz?
- 26. ¿Se usa java.util.Observable en cualquier lugar?
- 27. ¿Por qué wordpress coloca "text/rocketscript" en lugar de "text/javascript" cuando se usa wp_register_script()?
- 28. ¿Por qué `instanceof` error en lugar de devolver` false` cuando se usa para 2 clases incompatibles?
- 29. ¿Por qué el argumento del tipo de mapa C++ requiere un constructor vacío cuando se usa []?
- 30. ¿Por qué no se usa clang más?
En realidad estoy pidiendo la inicialización con algunos valores exigidos por el usuario, supongamos que para fines de simulación tenemos que inicializar unas 20 variables con los valores dados. Si inicializo cada variable correctamente, entonces en este caso ¿te apegarás a tu argumento? –
@kashmirilegion ver mis ediciones. Si necesita inicializar 20 variables, puede definir un constructor que tome 20 variables o una que tome una estructura. –
tiene eso. Muchas gracias –