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:
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. –
@AdrianCornish: Ein konformer Compiler kann die Zugriffsebenen beliebig oft auswerten, solange es so aussieht, als ob sie in diesem bestimmten Schritt ausgewertet würden. –
Nein, kann es nicht - zeigen Sie mir den Standardabschnitt, der das sagt? –