2012-09-24 6 views
5

Angenommen, ich habe eine Klasse mit einer zwei Inline-Funktionen:Warum dürfen Inline-Funktionen private Membervariablen manipulieren?

class Class { 
public: 
    void numberFunc(); 
    int getNumber() { return number; } 
private: 
    int number; 
}; 

inline void Class::numberFunc() 
{ 
    number = 1937; 
} 

ich diese Klasse instanziiert und ich rufe beiden Funktionen in der Klasse:

int main() { 
    Class cls; 
    cls.numberFunc(); 
    cout << cls.getNumber() << endl; 
    return 0; 
} 

Ich verstehe, dass beiden Inline-Funktionen noch sind Mitglieder der Klasse, aber es ist auch mein Verständnis, dass der Code innerhalb des Körpers einer Inline-Funktion nur an der Stelle eingefügt wird, wo er aufgerufen wurde. Es scheint, dass als Folge des Einsatzes, soll ich direkt nicht in der Lage sein, um das variable Element zugreifen number da, soweit ich weiß, wird der Code in main() an den Compiler aussehen würde:

main() { 
    Class cls; 
    cls.number = 1937; 
    cout << cls.number << endl; 
    return 0; 
} 

Can Jemand erklärt mir, warum ich immer noch auf diese privaten Mitglieder zugreifen kann, oder korrigiere mich auf mein Verständnis von Inline-Funktionen? Ich weiß, dass Compiler die Option haben, die inline auf einigen Funktionen zu ignorieren; ist das was hier passiert?

Ausgang:

Antwort

9

Die Regeln für den Zugriff auf private Member einer Klasse werden vom Compiler für Ihren C++ - Code erzwungen. Diese Regeln gelten nicht direkt für die Ausgabe des Compilers, also für den Code, den ein Computer ausführt.

4

Der private Zugriffsbezeichner ist eine Beschränkung der Benutzer der Klasse (die Programmierer), nicht auf dem Compiler. Der Compiler kann tun, was er will, solange das beobachtbare Verhalten des Programms gleich ist.

+0

Nein - ein konformer Compiler kann nicht tun, was er will - die Zugriffsspezifizierer werden während eines bestimmten Kompilierungsschritts ausgewertet - nachdem sie nicht erneut überprüft werden. –

+2

@AdrianCornish: Ein konformer Compiler kann die Zugriffsebenen beliebig oft auswerten, solange es so aussieht, als ob sie in diesem bestimmten Schritt ausgewertet würden. –

+0

Nein, kann es nicht - zeigen Sie mir den Standardabschnitt, der das sagt? –

6

Das Schlüsselwort inline bedeutet, dass der Programmierer denkt, dass der Compiler, wenn er den Code an der Stelle des Aufrufs einfügen will. Der Compiler kann andere Funktionen auch ohne das Schlüsselwort inline ausführen. Der Compiler denkt vielleicht, dass der Programmierer dumm ist und ignoriert das Schlüsselwort und nicht inline. Es ist alles nach C++ Standard.

Die Inline-Member-Funktion ist ansonsten ganz normale Member-Funktion. Keine anderen Privilegien oder Einschränkungen.

Inlines verursachen keine Fehler, wenn die Funktion von mehreren Kompilierungseinheiten definiert wird (einschließlich der Headerdatei, in der die Inline-Funktion definiert ist). Das mag ein Grund sein, warum Leute Inline-Funktionen schreiben.

+0

'inline' erlaubt auch die Verletzung der ODR-Regel. –

+0

Ich werde es hinzufügen, danke, möglicherweise ist das ein Grund, warum die Inlines verwendet werden. –