2012-03-17 17 views
8

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

6

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.

+0

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? –

+0

@kashmirilegion ver mis ediciones. Si necesita inicializar 20 variables, puede definir un constructor que tome 20 variables o una que tome una estructura. –

+0

tiene eso. Muchas gracias –

3

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.

+0

Que está todo bien hasta que tenga que devolver un código de error en tiempo de ejecución. : P – chrisaycock

+0

@chrisaycock: Touché. Pero siempre hay excepciones ... –

+0

+1 por su buena respuesta. Gracias a su argumento, le dio fuerza a la mente para hacer una manera clara sobre los constructores. –

0

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.

0

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).

1

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.

+0

Lo cual está muy bien, a menos que seas un fanático de los objetos inmutables. –

+0

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

0

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: -

  1. definir el método
  2. 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: -.

  1. Definir el constructor

La 'parte llamando' es se realiza automáticamente cada vez que se crea un nuevo objeto de la clase.

0

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.

Cuestiones relacionadas