Observe o código:
#include <iostream>
using namespace std;
class Pessoa {
public:
    string nome;
};
int main() {
    Pessoa p1, p2;
    p1.nome = "Ana";
    p2.nome = "Ana";
    cout << ( &p1 == &p2 ? "Iguais" : "Diferentes" );
}
O que será impresso?
a) Iguais
b) Diferentes
c) Ana Ana
d) Erro de compilação
e) Nenhuma saída

Passo 1

O enunciado dá o código em C++ abaixo e pergunta qual será a saída impressa pelo programa, oferecendo alternativas:
#include <iostream>
using namespace std;
class Pessoa {
public:
    string nome;
};
int main() {
    Pessoa p1, p2;
    p1.nome = "Ana";
    p2.nome = "Ana";
    cout << ( &p1 == &p2 ? "Iguais" : "Diferentes" );
}
Informações relevantes fornecidas:
  • Existe uma classe Pessoa com um membro público nome do tipo std::string.
  • No main são declaradas duas variáveis: p1 e p2, ambas do tipo Pessoa.
  • As duas têm nome atribuído para "Ana".
  • A saída do cout usa a expressão (&p1 == &p2 ? "Iguais" : "Diferentes").
    Pergunta: qual das alternativas será impressa?

Passo 2

Entender a expressão usada em cout: condição ? valor_se_verdadeiro : valor_se_falso.
  • Isso é o operador ternário em C++.
  • Ele avalia primeiro a condição. Se a condição for verdadeira (non-zero / true), a expressão inteira tem o valor valor_se_verdadeiro; caso contrário, tem o valor valor_se_falso.
    Exemplo simples: int x = 5; cout << (x > 3 ? "maior" : "menor"); imprime maior porque x > 3 é verdadeiro.

Passo 3

Analisar a condição específica: &p1 == &p2.
  • O operador & aplicado a uma variável dá o endereço dessa variável na memória (um ponteiro para aquele objeto).
  • Então &p1 é um ponteiro para o objeto p1 e &p2 é um ponteiro para o objeto p2.
  • O operador == entre dois ponteiros compara os endereços — ou seja, verifica se ambos apontam exatamente para o mesmo local na memória.

Passo 4

Saber se &p1 e &p2 são iguais no código dado:
  • p1 e p2 são duas variáveis separadas, declaradas independentemente em main.
  • Cada variável automática (local) ocupa um espaço distinto na pilha (stack), recebendo endereços diferentes.
  • Mesmo que p1.nome e p2.nome tenham o mesmo conteúdo ("Ana"), isso não faz com que os próprios objetos p1 e p2 tenham o mesmo endereço.
  • Portanto, &p1 e &p2 apontam para locais diferentes, então a comparação &p1 == &p2 resulta em falso.

Passo 5

Consequência para o operador ternário e para o cout:
  • Como a condição &p1 == &p2 é falsa, o operador ternário escolhe o segundo valor: "Diferentes".
  • O cout imprime exatamente essa string. Não há erro de compilação aqui; tudo é código válido e definido.
  • Observação didática extra (útil na prova): se a intenção fosse comparar o conteúdo dos nomes, a expressão correta seria p1.nome == p2.nome, que compara o conteúdo das std::string e nesse caso seria verdadeira.

Passo 6

Resumo final e encorajamento:
  • A comparação feita é entre endereços, não entre conteúdos.
  • Como os objetos são distintos, a condição é falsa e o programa imprime a alternativa correspondente a “Diferentes”.
    Você está quase lá — essas dúvidas de endereço vs conteúdo confundem muita gente, mas agora você já sabe diferenciar!

Resposta

b) Diferentes

Exercícios relacionados