#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.
#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();
}
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.
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 fazcout << "Injetando combustível." << endl;. - Existe a classe Carro com um membro privado
motordo tipoMotor. - A classe Carro tem um método público
acelerar()que chamamotor.injetar();e em seguida fazcout << "Acelerando..." << endl;. - No
main()é criado um objetoCarro fusca;e logo depois é chamadofusca.acelerar();. - As strings que serão impressas estão exatamente no código:
"Injetando combustível."e"Acelerando...", cada uma seguida deendl(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).endlinsere 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 executarmotor.injetar();a primeira linha mostrada no terminal será:
Injetando combustível.
Passo 5
Depois que
Acelerando…
Também seguida de nova linha por causa de
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.
Acelerando…
"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)