#include <iostream>
using namespace std;
class Motor {
public:
Motor() { cout << "Motor criado" << endl; }
~Motor() { cout << "Motor destruído" << endl; }
};
class Carro {
private:
Motor m;
public:
Carro() { cout << "Carro criado" << endl; }
~Carro() { cout << "Carro destruído" << endl; }
};
int main() {
Carro c;
}
Qual é a ordem de execução?
a) Motor criado -> Carro criado -> Carro destruído -> Motor destruído
b) Motor criado -> Carro criado
C) Carro criado -> Motor criado -> Carro destruído -> Motor destruído
d) Carro criado -> Motor criado -> Motor destruído -> Carro destruído
e) Nenhuma saída
#include <iostream>
using namespace std;
class Motor {
public:
Motor() { cout << "Motor criado" << endl; }
~Motor() { cout << "Motor destruído" << endl; }
};
class Carro {
private:
Motor m;
public:
Carro() { cout << "Carro criado" << endl; }
~Carro() { cout << "Carro destruído" << endl; }
};
int main() {
Carro c;
}
a) Motor criado -> Carro criado -> Carro destruído -> Motor destruído
b) Motor criado -> Carro criado
C) Carro criado -> Motor criado -> Carro destruído -> Motor destruído
d) Carro criado -> Motor criado -> Motor destruído -> Carro destruído
e) Nenhuma saída
Passo 1
O enunciado me deu um programa em C++ que define duas classes:
Motor (com construtor que imprime “Motor criado” e destrutor que imprime “Motor destruído”) e Carro (que tem um membro privado Motor m, um construtor que imprime “Carro criado” e um destrutor que imprime “Carro destruído”). No main() é criado um objeto Carro c;. A pergunta é: qual a ordem das mensagens impressas quando o programa roda? Foram dadas alternativas (a) até (e).Passo 2
O que é importante saber sobre construtores e destrutores (explicação didática):
- Construtor: é uma função especial chamada automaticamente quando um objeto é criado; costuma inicializar recursos e, neste caso, imprimir mensagens.
- Destrutor: é chamada automaticamente quando o objeto sai de escopo ou é deletado; costuma liberar recursos e aqui imprime mensagens.
Vou explicar de forma bem direta como isso acontece para objetos que têm outros objetos como membros.
Passo 3
Regra de ordem de construção (essencial para resolver):
- Antes de executar o corpo do construtor da classe, o compilador constrói todos os membros não estáticos da classe.
- A ordem em que os membros são construídos é a ordem em que foram declarados dentro da classe (aqui só há um membro:
Motor m;).
Isso significa: ao criar umCarro, primeiro oMotor mé construído (portanto seu construtor roda), depois o corpo do construtor deCarroé executado.
Passo 4
Aplicando a construção ao código dado:
- Ao entrar em
main()e executarCarro c;: primeiro é chamado o construtor dem(ou seja,Motor()), que imprime “Motor criado”. - Depois é executado o corpo do construtor de
Carro, que imprime “Carro criado”.
Portanto, durante criação a sequência de impressões é: “Motor criado” seguido de “Carro criado”.
Passo 5
Regra de ordem de destruição (essencial para resolver):
- No momento da destruição, o corpo do destrutor da classe é executado primeiro (ou seja, o destrutor de
Carroroda e seu código é executado). - Depois disso, os membros não estáticos são destruídos em ordem inversa àquela em que foram construídos (isto é, na prática, em ordem reversa de declaração).
Com um único membrom, isso significa: primeiro o destrutor deCarroimprime, depois o destrutor deMotorimprime.
Passo 6
Aplicando a destruição ao código dado:
- Quando
main()termina ecsai de escopo, o destrutor deCarroé chamado e imprime “Carro destruído”. - Em seguida o destrutor de
Motor mé chamado e imprime “Motor destruído”.
Portanto, durante destruição a sequência é: “Carro destruído” seguido de “Motor destruído”.
Passo 7
Juntando criação e destruição, a sequência total de saída do programa é:
Motor criado -> Carro criado -> Carro destruído -> Motor destruído
Essa sequência corresponde exatamente à alternativa (a).
Motor criado -> Carro criado -> Carro destruído -> Motor destruído
Essa sequência corresponde exatamente à alternativa (a).
Resposta
a) Motor criado -> Carro criado -> Carro destruído -> Motor destruído