C++ OOP constructor implicito - ¿se crea automaticamente un constructor implicit

Iniciado por GisiNA, 13 Abril 2017, 18:40 PM

0 Miembros y 1 Visitante están viendo este tema.

GisiNA

Hola a todos!

Tengo una duda de curiosidad.

Dispongo de dos libros diferentes sobre C++. Al revisar el tema constructores plantea uno de ellos que cada clase tiene al menos un constructor. De no definirse uno por quien escribe el código, coloca el compilador un constructor por defecto, o sea: Constructor(){}, automáticamente.

El otro libro, que hasta ahora me ha parecido bastante mejor que el recién señalado, dice que cada clase puede tener ninguno, uno o más constructores. NO dice que el compilador establece, en caso de ausencia plena de uno explícitamente definido, uno implícitamente. De lo contrario, el programa puede funcionar, pero pueden surgir problemas con la inicialización del objeto y en general con el funcionamiento del programa, dado que el sistema de ejecución asume un constructor por defecto.

Así que me he puesto a googlear... Y he visto que en varias partes se sostiene lo mismo que en el primer libro referido.

Ahora bien, no soy novata, pero estoy lejos de ser diestra en C++ OOP.

Sin embargo, hice un experimento, para determinar cuál de ambos puntos de vista, es el correcto.

Escribí un pequeño código de prueba una vez sin y una vez con la declaración explícita de un constructor por defecto.

A continuación el programa con un objeto poco afín al trabajo pero hablador sin haber declarado un constructor:

Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

class Constuctor
{
   private:
void funktion_work()
{ cout << "I have to work... Buhhhh" << endl;  }

  protected:
void funktion_lenguagesConstuctor()
{ cout << "I can english." << endl;
cout << "I can deutsch." << endl;
cout << "I can espaniol." << endl;
}

  public:

void funktion_lenguagesConstuctor_public()
{
funktion_lenguagesConstuctor();
}
};

int main(int argc, char **argv){

Constuctor constructor;
constructor.funktion_lenguagesConstuctor_public();

return 0;
}


Y a continuación, lo mismo pero con un constructor explícitamente declarado (línea 21):

Código (cpp) [Seleccionar]


#include <iostream>

using namespace std;

class Constuctor
{
   private:
void funktion_work()
{ cout << "I have to work... Buhhhh" << endl;  }

  protected:
void funktion_lenguagesConstuctor()
{ cout << "I can english." << endl;
cout << "I can deutsch." << endl;
cout << "I can espaniol." << endl;
}

  public:

Constuctor(){}
void funktion_lenguagesConstuctor_public()
{
funktion_lenguagesConstuctor();
}
};

int main(int argc, char **argv){

Constuctor constructor;
constructor.funktion_lenguagesConstuctor_public();

return 0;
}



Lo que me parece interesante es que el programa resultante es más pesado cuando tiene un constructor explícitamente declarado:

Peso del ejecutable sin constructor declarado: 21472 Bytes
Peso del ejecutable con constructor declarado: 21856 Bytes

La diferencia es de 384 Bytes.

De acuerdo a los pesos del ejecutable  tendría razón el libro que no señala la existencia de un constructor implícito colocado por el compilador y que hasta ahora me ha parecido un libro excelente.

Sin embargo, como ya decía, el otro libro y una gran parte de los textos en google dicen lo contrario.

Estoy confusa...  :-\
Alguien tiene alguna mayor claridad sobre este tema?

Muy agradecida por vuestros comentarios me despido,
Gisi

ivancea96

Cuando no defines ningún constructor para una clase, existe un constructor por defecto que no hace nada (salvo llamar a los constructores de los campos que tenga que sean clases).

Eso es lo que dice el estándar.
Luego, cada compilador hará lo que vea, aunque generalmente se ceñirán al estándar.
Con esta última frase quiero decir, que si tú declaras un constructor, aunque sea el constructor por defecto con el cuerpo vacío, el compilador puede agregarlo al código si quiere.

En fin, el lenguaje C++ es un estándar y tiene un funcionamiento. Los "bytes" que ocupe el programa generado por el compilador, es algo a parte.


Si usas GCC para compilar, pasándole el argumento "-S", obtendrás el código ensamblador resultante. Ahí puedes ver con más detalle qué genera.

Y sobre temas del estándar de C++, puedes utilizar: http://en.cppreference.com/w/cpp/language/default_constructor

GisiNA

Hola!

Primero que todo agradecer tu respuesta.

Muchas gracias por el -s flag.

Efectivamente resultan ambos ejecutables generados del mismo tamaño.

Tomaré entonces la proposición que dice que un constructor implícito es generado por el compilador como correcta.

Saludos!