2012-09-24 30 views
5

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:

Respuesta

9

Las reglas para acceder a miembros privados de una clase son impuestas por el compilador en su código C++. Estas reglas no se aplican directamente a la salida del compilador, que es el código que ejecuta una computadora.

4

El especificador de acceso private es una restricción de los usuarios de la clase (los programadores), no en el compilador. El compilador puede hacer lo que quiera, siempre que el comportamiento observable del programa sea el mismo.

+0

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

+2

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

+0

No, no puede - muéstrame la sección estándar que dice esto? –

6

La palabra clave inline significa que el programador cree que el compilador puede si desea insertar el código en el lugar de la llamada. El compilador también puede alinear otras funciones sin la palabra clave. El compilador puede pensar que el programador es tonto e ignorar la palabra clave y no en línea. Todo es por C++ estándar.

La función miembro en línea es, por lo demás, una función de miembro bastante normal. No hay otros privilegios o restricciones.

Las líneas internas no causan errores porque la función está definida por varias unidades de compilación (que incluyen el archivo de encabezado donde se define la función en línea). Esa puede ser una de las razones por las cuales las personas escriben funciones en línea.

+0

'inline' también permite la violación de la regla ODR también. –

+0

Lo agregaré, gracias, posiblemente esa es una de las razones por las que se usan las líneas. –

Cuestiones relacionadas