Declaração de amigo em C ++ - diferença entre público e privado

142

Existe uma diferença entre declarar uma função / classe de amigo como privada ou pública? Não consigo encontrar nada sobre isso online.

Quero dizer a diferença entre:

class A
{
 public: 
      friend class B;
 };

e

class A
{
 private: //or nothing as the default is private
      friend class B;
 };

Existe alguma diferença?

BIU
fonte
28
Tal desinformação ... alguém não merecia ser amigo. Depende inteiramente de você se você gosta de seus amigos escondidos com seus amigos.
Tony Delroy
posso perguntar o que é uma classe de amigo: '(?
I Phantasm I
3
@ Phantasm - é uma declaração que permite que uma instância da friendclasse acesse os membros declarados privatena classe que fez a declaração. No caso deste exemplo, uma instância da classe B pode acessar os membros privados da classe A
BIU
2
Esta pergunta me valeu muitos pontos neste site. Tudo bem então.
BIU

Respostas:

139

Não, não há diferença - basta dizer que a classe B é amiga da classe A e agora pode acessar seus membros privados e protegidos, só isso.

dente afiado
fonte
5
então acho que quem me disse isso simplesmente não sabia do que estava falando. Obrigado :)
BIU
mas, para fins de documentação, você consideraria um frienddetalhe de implementação ou parte da interface?
TemplateRex
1
@TemplateRex: IMO que faz parte da interface - é uma afirmação bastante forte de que existem alguns (aleatórios) class Friendque podem acessar todos os membros privados da classe atual.
Sharptooth
para aula aleatória, sim. Mas digamos que você implemente operator==(T, T)usando membros de dados privados de Te use friendcomo um detalhe de implementação para que operator==possa aparecer como um não membro. IMO, esta amizade não deve aparecer na interface pública (como será gerada pelo Doxygen por exemplo)
TemplateRex
Li há algum tempo aqui no stackoverflow que alguns compiladores, acho que alguns antigos, de buggy, ficarão confusos se uma declaração de amigo acontecer dentro de uma região não pública.
Peregring-lk
35

Como a sintaxe friend class Bnão declara um membro da classe A, não importa onde você a escreva, a classe Bé amiga da classe A.

Além disso, se você escrever friend class Bna protectedseção de A, NÃO significa que Bpode acessar apenas protectede publicmembros de A.

Lembre-se sempre de que, uma vez que se Btorne amigo A, ele poderá acessar qualquer membro A, independentemente da seção em que você escrever friend class B.

Nawaz
fonte
3
então acho que quem me disse isso simplesmente não sabia do que estava falando. Obrigado :)
BIU
-1

A declaração de amigo aparece em um corpo de classe e concede a uma função ou outra classe acesso a membros privados e protegidos da classe onde a declaração de amigo aparece.

Como esses especificadores de acesso não afetam o significado das declarações de amigos (elas podem aparecer nas seções privada: ou pública: sem diferença).

goyuiitv
fonte
Responder a uma pergunta de sete anos sem ser novo. Evite tornar as coisas mais duplicadas.
MAChitgarha