Supponiamo che io ho una classe con un due funzioni inline:Perché le funzioni in linea sono autorizzate a modificare le variabili dei membri privati?
class Class {
public:
void numberFunc();
int getNumber() { return number; }
private:
int number;
};
inline void Class::numberFunc()
{
number = 1937;
}
ho un'istanza di quella classe e mi chiamano entrambe le funzioni nella classe:
int main() {
Class cls;
cls.numberFunc();
cout << cls.getNumber() << endl;
return 0;
}
Capisco che entrambe le funzioni in linea sono ancora membri della classe, ma è anche a mia conoscenza che il codice all'interno del corpo di una funzione inline è appena inserito al posto di dove è stato chiamato. Sembra che, a seguito di che inserto, non dovrei essere in grado di accedere direttamente alla variabile membro number
perché, per quanto ne so, il codice in main()
al compilatore sarà simile:
main() {
Class cls;
cls.number = 1937;
cout << cls.number << endl;
return 0;
}
Can qualcuno mi spiega perché sono ancora in grado di accedere a quei membri privati o correggermi sulla mia comprensione delle funzioni inline? So che i compilatori hanno la possibilità di ignorare lo inline
su alcune funzioni; è questo che sta succedendo qui?
uscita:
No - un compilatore conforme non può fare ciò che vuole - lo specificatore di accesso viene valutato durante una particolare fase della compilazione - dopo che non sono stati nuovamente controllati. –
@AdrianCornish: un compilatore conforme può evauluare i livelli di accesso ogni volta che lo desidera, a condizione che siano stati valutati in quel particolare passaggio. –
No non può - mostrami la sezione standard che dice questo? –