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
#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
Pessoacom um membro públiconomedo tipostd::string. - No
mainsão declaradas duas variáveis:p1ep2, ambas do tipoPessoa. - As duas têm
nomeatribuído para"Ana". - A saída do
coutusa 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 valorvalor_se_verdadeiro; caso contrário, tem o valorvalor_se_falso.
Exemplo simples:int x = 5; cout << (x > 3 ? "maior" : "menor");imprimemaiorporquex > 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 objetop1e&p2é um ponteiro para o objetop2. - 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:p1ep2são duas variáveis separadas, declaradas independentemente emmain.- Cada variável automática (local) ocupa um espaço distinto na pilha (stack), recebendo endereços diferentes.
- Mesmo que
p1.nomeep2.nometenham o mesmo conteúdo ("Ana"), isso não faz com que os próprios objetosp1ep2tenham o mesmo endereço. - Portanto,
&p1e&p2apontam para locais diferentes, então a comparação&p1 == &p2resulta 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
coutimprime 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 dasstd::stringe 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