2015-01-04 6 views
5

In einer Klasse, wenn die Funktion als Freund innerhalb der verschiedenen Spezifizierer wie - privat, geschützt oder öffentlich erklärt wird, gibt es einen Unterschied. Nach meinem Verständnis ist Freund Funktion kein Mitglied. Daher sollte es nicht wichtig sein. Aber, wenn ich statisch sehe - es ist auch kein Mitglied, aber Zugriffsspezifizierer ist sehr wichtig. Also bin ich ein bisschen verwirrt. Wie funktioniert dieser Code? Gibt es einen Unterschied zwischen den folgenden Klassen?Ist der Zugriffsbezeichner für eine Freundesfunktion wichtig?

/** 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

* "Aber, wenn ich statisch sehe - es ist auch kein Mitglied" * - Ja. Es ist. –

+0

Statisch ist ein Klassenmitglied und kein Objektmitglied. –

+0

Der Begriff "Objektelement" existiert nicht im C++ - Standard. Es gibt statische Klassenmitglieder und nicht statische Klassenmitglieder. –

Antwort

5

Nein, spielt keine Rolle.

C++ Standard Abschnitt § 11.3/9 [friend.class]

Die Bedeutung der Freund Erklärung ist das gleiche, ob die Freund Erklärung erscheint im privaten, geschützten oder öffentlichen (9.2) Teil der Klassenmember-Spezifikation.

Hinweis:

Eine statische Funktion innerhalb der Klasse deklariert ist immer noch ein Klassenmitglied. Eine Freund-Funktion ist nicht.

+0

Warum statisch dann? –

+2

@dexterous_stranger: Eine Friend-Funktion ist keine Member-Funktion. 'static' ist ein Modifikator für ein Klassenmitglied. Eine Freundschaftsdeklaration kann kein Mitglied deklarieren, sondern gewährt nur speziellen Zugriffsrechten auf eine Nichtmitgliedsfunktion (der aktuellen Klasse). – quantdev