2012-09-24 14 views
5

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:

risposta

9

Le regole per accedere ai membri privati ​​di una classe vengono applicate dal compilatore sul codice C++. Queste regole non si applicano direttamente all'output del compilatore, che è il codice che un computer possiede.

4

L'accesso private specificatore è una restrizione sugli utenti della classe (i programmatori), non sul compilatore. Il compilatore può fare tutto ciò che vuole, purché il comportamento osservabile del programma sia lo stesso.

+0

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. –

+2

@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. –

+0

No non può - mostrami la sezione standard che dice questo? –

6

La parola chiave inline significa che il programmatore pensa che il compilatore possa se vuole inserire il codice al posto di chiamata. Il compilatore può incorporare anche altre funzioni senza la parola chiave. Il compilatore può pensare che il programmatore sia pazzo e ignorare la parola chiave e non in linea. È tutto secondo lo standard C++.

La funzione membro inline è in genere una funzione membro abbastanza normale. Nessun altro privilegio o restrizione.

Inline non causano errori che la funzione è definita da più unità di compilazione (che includono il file di intestazione in cui è definita la funzione inline). Questo potrebbe essere uno dei motivi per cui le persone scrivono funzioni inline.

+0

'inline' consente anche la violazione della regola ODR. –

+0

Lo aggiungerò, grazie, forse questa è una delle ragioni per cui vengono utilizzati gli inline. –

Problemi correlati