#include <iostream>
using namespace std;
class Motor {
public:
    void injetar() { cout << "Injetando combustível." << endl; }
};
class Carro {
private:
    Motor motor;
public:
    void acelerar() {
        motor.injetar();
        cout << "Acelerando..." << endl;
    }
};
int main() {
    Carro fusca;
    fusca.acelerar();
}
O que será impresso?
a) Acelerando…
b) Injetando combustível.
Acelerando…
c) Erro de compilação.
d) Nenhuma saída.
e) Injetando combustível apenas.

Passo 1

O enunciado mostra um programa em C++ e pergunta qual será a saída produzida quando ele for executado, com opções:
a) Acelerando…
b) Injetando combustível.
Acelerando…
c) Erro de compilação.
d) Nenhuma saída.
e) Injetando combustível apenas.
Informações relevantes dadas pelo código:
  • Existe a classe Motor com um método público injetar() que faz cout << "Injetando combustível." << endl;.
  • Existe a classe Carro com um membro privado motor do tipo Motor.
  • A classe Carro tem um método público acelerar() que chama motor.injetar(); e em seguida faz cout << "Acelerando..." << endl;.
  • No main() é criado um objeto Carro fusca; e logo depois é chamado fusca.acelerar();.
  • As strings que serão impressas estão exatamente no código: "Injetando combustível." e "Acelerando...", cada uma seguida de endl (quebra de linha).

Passo 2

Entendendo a relação entre as classes (sem resolver ainda): o Carro contém um Motor como membro. Isso se chama composição: um objeto maior (o Carro) tem internamente outro objeto (o Motor). Como não há construtores definidos explicitamente, o compilador cria construtores padrão automaticamente — então a criação de Carro fusca; é válida e cria também internamente o motor.

Passo 3

O que acontece quando fusca.acelerar(); é executado: o fluxo de execução vai para o método Carro::acelerar(). Dentro desse método a primeira instrução é motor.injetar();. Ou seja, o código chama o método injetar() do membro motor que pertence ao fusca.

Passo 4

O que faz Motor::injetar(): ele executa cout << "Injetando combustível." << endl;. Explicando isso de forma didática:
  • cout << "Injetando combustível." envia os caracteres dessa string para a saída padrão (tela).
  • endl insere um caractere de nova linha e também força o esvaziamento do buffer de saída (flush), garantindo que a linha apareça imediatamente.
    Portanto, ao executar motor.injetar(); a primeira linha mostrada no terminal será:
    Injetando combustível.

Passo 5

Depois que motor.injetar() termina, a execução retorna para Carro::acelerar(), que continua na próxima instrução: cout << "Acelerando..." << endl;. Isso imprime uma nova linha:
Acelerando…
Também seguida de nova linha por causa de endl.

Passo 6

Juntando a ordem das chamadas e das impressões: primeiro é impresso "Injetando combustível." (com nova linha) e depois é impresso "Acelerando..." (com nova linha). Não há erro de compilação nem caminhos que impeçam a saída. Logo a saída final do programa são duas linhas, nessa ordem:
Injetando combustível.
Acelerando…

Passo 7

Resumo prático para a prova: quando um método de um membro é chamado dentro de outro método, a chamada ocorre imediatamente na ordem em que está escrita. cout imprime na ordem das chamadas e endl adiciona quebra de linha. Se tiver dúvida em outra questão parecida, desenhe a sequência de chamadas para ver a ordem das impressões.

Resposta

(b)

Exercícios relacionados