Salida del programa C++ | conjunto 14

Prediga la salida del siguiente programa C++.

Nivel de dificultad: Novato

Pregunta 1

#include <iostream>
using namespace std;
  
class A
{
    int id;
public:
    A (int i) { id = i; }
    void print () { cout << id << endl; }
};
  
int main()
{
    A a[2];
    a[0].print();
    a[1].print();
    return 0;
}

Hay un error de compilación en la línea «A a[2]». No hay un constructor predeterminado en la clase A. Cuando escribimos nuestro propio constructor parametrizado o copiamos el constructor, el compilador no crea el constructor predeterminado (vea este Gfact ). Podemos corregir el error, ya sea creando un constructor predeterminado en la clase A o usando la siguiente sintaxis para inicializar el miembro de la array usando un constructor parametrizado.

 // Initialize a[0] with value 10 and a[1] with 20 
 A a[2] = { A(10),  A(20) } 

Pregunta 2

#include <iostream>
using namespace std;
  
class A
{
    int id;
    static int count;
public:
    A()
    {
        count++;
        id = count;
        cout << "constructor called " << id << endl;
    }
    ~A()
    {
        cout << "destructor called " << id << endl;
    }
};
  
int A::count = 0;
  
int main()
{
    A a[2];
    return 0;
}

Producción:

constructor called 1
constructor called 2
destructor called 2
destructor called 1

En el programa anterior, el objeto a[0] se crea primero, pero el objeto a[1] se destruye primero. Los objetos siempre se destruyen en orden inverso al de su creación. El motivo del orden inverso es que un objeto creado más tarde puede usar el objeto creado anteriormente. Por ejemplo, considere el siguiente fragmento de código.

A a;
B b(a);

En el código anterior, el objeto ‘b’ (que se crea después de ‘a’), puede usar algunos miembros de ‘a’ internamente. Entonces, la destrucción de ‘a’ antes de ‘b’ puede crear problemas. Por lo tanto, el objeto ‘b’ debe ser destruido antes que ‘a’.

Pregunta 3

#include <iostream>
using namespace std;
  
class A
{
   int aid;
public:
   A(int x)
   { aid = x; }
   void print()
   { cout << "A::aid = " <<aid; }
};
  
class B
{
    int bid;
public:
    static A a;
    B (int i) { bid = i; }
};
  
int main()
{
  B b(10);
  b.a.print();
  return 0;
}

Error del compilador: referencia indefinida a ‘B::a’
La clase B tiene un miembro estático ‘a’. Dado que el miembro ‘a’ es estático, debe definirse fuera de la clase. La clase A no tiene un constructor predeterminado, por lo que también debemos pasar un valor en la definición. Agregando una línea “AB::a(10);” hará que el programa funcione.

El siguiente programa funciona bien y produce la salida como «A::aid = 10»

#include <iostream>
using namespace std;
  
class A
{
   int aid;
public:
   A(int x)
   { aid = x; }
   void print()
   { cout << "A::aid = " <<aid; }
};
  
class B
{
    int bid;
public:
    static A a;
    B (int i) { bid = i; }
};
  
A B::a(10);
  
int main()
{
  B b(10);
  b.a.print();
  return 0;
}

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *