Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal. Eu estava estudando sobre a sobrecarga do operador de extração(<<) e vi que pra fazer a sobrecarga deve-se usar obrigatoriamente uma função amiga na classe pra onde o operador sobrecarregado será usado. Por que isso é obrigatório? Por que eu não poderia declarar a função dentro da classe?

Postado

Olá

Acho que já discutimos isso aqui e eu até postei um pequeno programa que redefinia uns 10 operadores. Não tenho o endereço agora.

 

22 horas atrás, Bimetal disse:

pra fazer a sobrecarga deve-se usar obrigatoriamente uma função amiga na classe pra onde o operador sobrecarregado será usado

 

Não é verdade. Não é obrigatório declarar a função de overload como amiga. Só conveniente. Se ela não for não terá acesso ao conteúdo da classe e você terá que usar getters. Só isso.

 

Esse operador << é associativo à esquerda então para declarar dentro da classe fica quase inútil. Funcionaria para 

MinhaClasse a,b;

e poderia escrever a << b; dependendo de como declarou tudo. Mas em geral o que se quer com << é redefinir para quando o operador à esquerda é... stream. Claro, você quer escrever cout << a porque é prático. E aí cai nessa situação que já discutimos

 

Quando você escreve cout << a << b << endl; é avaliado assim (cout << a) << b << endl; primeiro. Os parenteses são ilustrativos. Não tente usar. cout << a retorna stream, stream<<b retorna stream, stream<<endl; retorna stream e aí sai na tela.

 

 

Postado

Então @arfneto, eu ainda não consegui entender.

 

1 hora atrás, arfneto disse:

Se ela não for não terá acesso ao conteúdo da classe

 

Mas eu não poderia declarar a função de sobrecarga dentro da classe? Desse modo eu não teria acesso ao conteúdo da classe?

A ideia da sobrecarga desse operador é para a imprimir dados de um objeto direto por cout.

Postado
3 horas atrás, Bimetal disse:

Mas eu não poderia declarar a função de sobrecarga dentro da classe? Desse modo eu não teria acesso ao conteúdo da classe?

A ideia da sobrecarga desse operador é para a imprimir dados de um objeto direto por cout

 

acho que eu já te mostrei um exemplo disso semanas atrás. E o programa que eu postei mostrava exatamente isso, além de redefinir mais uns 10 operadores como exemplo -- + - = == << e outros. Talvez deva dar uma olhada nesse programa.

 

"Se ela não for não terá acesso ao conteúdo da classe" eu me referia claro a "Se ela não for declarada como friend não terá acesso ao conteúdo da classe". Só isso.

 

A questão de não poder estar dentro da classe eu expliquei: esse operador << left bit shift é associativo à esquerda. Se colocar na classe só vai poder usar na situacão que mostrei no tópico anterior...

 

5 horas atrás, arfneto disse:

escrever a << b; dependendo de como declarou tudo. Mas em geral o que se quer com << é redefinir para quando o operador à esquerda é... stream. Claro, você quer escrever cout << a porque é prático. E aí cai nessa situação que já discutimos

 

Quando você escreve cout << a << b << endl; é avaliado assim (cout << a) << b << endl; primeiro. Os parenteses são ilustrativos. Não tente usar. cout << a retorna stream, stream<<b retorna stream, stream<<endl; retorna stream e aí sai na tela

 

  Certo?

 

Mas porque isso é importante? 

 

-----

Vou deixar uma copia do programa aqui pra você não ter que pesquisar

 

conjunto.txt

Postado
1 hora atrás, Bimetal disse:

@arfneto Entendi. Obrigado.

 

Acontece que esse operador não era para isso: originalmente era o left-bit-shift, e desloca bits então é associativo à esquerda porque é onde está a base:

Ex:

    int i = 32;
    int j;
    printf("%d<<2=%d\n", i, i << 2);
    j = i << 2 << 2;
    printf("%d << 2 << 2   =%d\n", i, j);
    j = (i << 2) << 2;
    printf("(%d << 2) << 2= %d\n", i, j);
    j = i << (2 << 2);
    printf("%d << (2 << 2)=%d\n", i, j);

Mostra

32<<2=128
32 << 2 << 2   =512
(32 << 2) << 2= 512
32 << (2 << 2)=8192

Entendeu? Associativo à ESQUERDA. Sem parenteses executa primeiro o da esquerda

 

E foi redefinido para tratar streams em C++, mas ele nasceu com essa outra personalidade, junto com o >>

 

Até

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!