2015-01-04 13 views
5

In una classe, se la funzione è dichiarata come amico all'interno del diverso identificatore come - privato, protetto o pubblico, allora c'è qualche differenza. Secondo la mia comprensione, la funzione amico non è un membro. Quindi, non dovrebbe importare. Ma, se vedo statico, non è nemmeno un membro, ma gli specificatori di accesso contano molto. Quindi, sono un po 'confuso. Come funziona tutto questo codice? C'è qualche differenza tra le seguenti classi?Lo specificatore di accesso è importante per una funzione amico?

/** Private friend function **/ 

class frienddemoFunction 
{ 
    private: 
     unsigned int m_fanSpeed; 
     unsigned int m_dutyCycle; 
     /** This function is not a member of class frienddemo **/ 
     friend void printValues(frienddemoFunction &d); 

    public: 
     void setFanSpeed(unsigned int fanSpeed); 
     unsigned int getFanSpeed(); 

}; 


/** Protected -- Friend Function **/ 
class frienddemoFunction 
{ 
    private: 
     unsigned int m_fanSpeed; 
     unsigned int m_dutyCycle; 

    public: 
     void setFanSpeed(unsigned int fanSpeed); 
     unsigned int getFanSpeed(); 

protected: 

/** This function is not a member of class frienddemo **/ 
     friend void printValues(frienddemoFunction &d); 


}; 

class frienddemoFunction 
{ 
    private: 
     unsigned int m_fanSpeed; 
     unsigned int m_dutyCycle; 

    public: 
     void setFanSpeed(unsigned int fanSpeed); 
     unsigned int getFanSpeed(); 

/** This function is not a member of class frienddemo **/ 
     friend void printValues(frienddemoFunction &d); 


}; 


/** This function is not a member of class frienddemo **/ 
    friend void printValues(frienddemoFunction &d); 
+2

* "Ma, se vedo statico, non è nemmeno un membro" * - Sì. È. –

+0

Statico è un membro della classe e non un membro dell'oggetto. –

+0

Il termine "membro dell'oggetto" non esiste nello standard C++. Ci sono membri della classe statici e membri della classe non statici. –

risposta

5

No, non importa.

standard C++, sezione § 11.3/9 [friend.class]

Il significato della dichiarazione amico è lo stesso se la dichiarazione amico appare nella (9.2) parte privata, protetta o pubblica della specifica del membro della classe.

Nota:

una funzione statica dichiarata all'interno della classe è ancora un membro della classe. Una funzione amico no.

+0

Perché le questioni statiche allora? –

+2

@dexterous_stranger: una funzione amico non è una funzione membro. 'static' è un modificatore per un membro della classe. Una dichiarazione di amicizia non dichiara un membro, fornisce semplicemente diritti di accesso speciali a una funzione di non membro (della classe corrente). – quantdev

Problemi correlati