Supongamos que tengo una clase con otros dos funciones en línea:¿Por qué las funciones en línea pueden manipular variables de miembros privados?
class Class {
public:
void numberFunc();
int getNumber() { return number; }
private:
int number;
};
inline void Class::numberFunc()
{
number = 1937;
}
que instanciar la clase y me llaman tanto de las funciones de la clase:
int main() {
Class cls;
cls.numberFunc();
cout << cls.getNumber() << endl;
return 0;
}
entiendo que ambas funciones en línea son todavía miembros de la clase, pero también entiendo que el código dentro del cuerpo de una función en línea simplemente se inserta en el lugar de donde se lo llamó. Parece que, como resultado de esa inserción, que no debería ser capaz de acceder directamente a la variable miembro number
porque, por lo que yo sé, el código en main()
al compilador se vería así:
main() {
Class cls;
cls.number = 1937;
cout << cls.number << endl;
return 0;
}
Puede ¿alguien me explica por qué todavía puedo acceder a esos miembros privados, o me corrige en mi entendimiento de las funciones en línea? Sé que los compiladores tienen la opción de ignorar el inline
en algunas funciones; es eso lo que está pasando aquí?
Salida:
No: un compilador conforme no puede hacer lo que quiere, el especificador de acceso se evalúa durante un determinado paso de compilación, después de que no se vuelven a verificar. –
@AdrianCornish: un compilador conforme puede evacuar los niveles de acceso siempre que lo desee, siempre que parezca que fueron evaluados en ese paso en particular. –
No, no puede - muéstrame la sección estándar que dice esto? –