Dichiarazione di amicizia in C ++ - differenza tra pubblico e privato


144

C'è una differenza tra dichiarare una funzione / classe di un amico come privata o pubblica? Non riesco a trovare nulla al riguardo online.

Intendo la differenza tra:

class A
{
 public: 
      friend class B;
 };

e

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

C'è una differenza?


29
Tale disinformazione ... qualcuno non meritava di essere un amico. Dipende interamente da te se ti piacciono i tuoi amici nascosti con i tuoi privati.
Tony Delroy,

posso chiedere cos'è una classe di amici: '(?
I Phantasm I

3
@I Fantasma - è una dichiarazione che consente a un'istanza della friendclasse di accedere ai membri dichiarati privatenella classe che ha effettuato la dichiarazione. Nel caso di questo esempio, un'istanza di classe B può accedere ai membri privati ​​di classe A
BIU


2
Questa domanda mi ha fatto guadagnare troppi punti su questo sito. Va bene allora.
BIU,

Risposte:


141

No, non c'è differenza: dici solo che la classe B è un amico della classe A e ora può accedere ai suoi membri privati ​​e protetti, tutto qui.


5
quindi immagino che chiunque mi abbia detto che proprio non sapesse di cosa stessero parlando. Grazie :)
BIU,

ma ai fini della documentazione, considereresti un frienddettaglio di implementazione o parte dell'interfaccia?
TemplateRex

1
@TemplateRex: IMO che fa parte dell'interfaccia - è una forte affermazione che ci sono alcuni (casuali) class Friendche possono accedere a tutti i membri privati ​​della classe corrente.
sharptooth,

per classe casuale, sì. Supponiamo però di implementare operator==(T, T)utilizzando i membri di dati privati Te utilizzarlo friendcome dettaglio di implementazione in modo che operator==possa apparire come non membro. IMO, questa amicizia non dovrebbe apparire nell'interfaccia pubblica (come sarà generato da Doxygen, ad esempio)
TemplateRex

Ho letto qualche tempo fa qui in StackOverflow che alcuni compilatori, immagino alcuni vecchi buggy, si confondono se una dichiarazione di amicizia avviene in una regione non pubblica.
Peregring-lk,

36

Poiché la sintassi friend class Bnon dichiara un membro della classe A, quindi non importa dove la scrivi, class Bè un amico di classe A.

Inoltre, se scrivi friend class Bnella protectedsezione di A, allora NON significa che Bpuò accedere solo protectede publicmembri di A.

Ricorda sempre che una volta Bdiventato amico di A, può accedere a qualsiasi membro A, indipendentemente dalla sezione in cui scrivi friend class B.


3
quindi immagino che chiunque mi abbia detto che proprio non sapesse di cosa stessero parlando. Grazie :)
BIU,

-2

La dichiarazione di amicizia appare in un corpo di classe e concede a una funzione oa un'altra classe l'accesso a membri privati ​​e protetti della classe in cui appare la dichiarazione di amico.

Poiché tali specificatori di accesso non hanno alcun effetto sul significato delle dichiarazioni di amici (possono apparire in sezioni private: o pubbliche: senza differenze).


Rispondere a una domanda di sette anni senza essere nuovo. Si prega di togliere dal rendere le cose più duplicate.
MAChitgarha,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.