La idea de la encapsulación es agrupar datos y métodos (que funcionan con los datos) y restringir el acceso de miembros de datos privados fuera de la clase. En C++, una función amiga o una clase amiga también pueden acceder a miembros de datos privados.
Entonces, ¿es posible acceder a miembros privados fuera de una clase sin un amigo? Sí, es posible usando punteros. Aunque es una laguna en C++, sí, es posible a través de punteros.
Ejemplo 1:
CPP
// CPP Program to initialize the private members and display // them without using member functions #include <bits/stdc++.h> using namespace std; class Test { private: int data; public: Test() { data = 0; } int getData() { return data; } }; int main() { Test t; int* ptr = (int*)&t; *ptr = 10; cout << t.getData(); return 0; }
10
Ejemplo 2:
CPP
// CPP Program to initialize the private members and display // them without using member functions #include <bits/stdc++.h> using namespace std; class A { private: int x; int y; }; // Driver Code int main() { A a; int* p = (int*)&a; *p = 3; p++; *p = 9; p--; cout << endl << "x = " << *p; p++; cout << endl << "y = " << *p; return 0; }
x = 3 y = 9
Explicación: En el programa anterior, a es un objeto de clase A. La dirección del objeto se asigna al puntero entero p mediante la aplicación de encasillamiento. El puntero p apunta al miembro privado x. El valor entero se asigna a *p, es decir, x. La dirección del objeto a aumenta y al acceder a la ubicación de la memoria, el valor 9 se asigna a y. La declaración p– establece la ubicación de memoria de x. El uso de la instrucción cout contiene de x se muestra.
Ejemplo 3:
CPP
// CPP Program to initialize and // display private members // using pointers #include <bits/stdc++.h> using namespace std; class A { private: int x; int y; }; class B : public A { public: int z; void show(int* k) { cout << "x = " << *k << " y = " << *(k + 1) << " z = " << *(k + 2); } }; int main() { // object declaration B b; // pointer declaration int* p; // address of z is assigned to p p = &b.z; // initialization of z *p = 3; // points to previous location p--; // initialization of y *p = 4; // points to previous location p--; // initialization of x *p = 5; // passing address of x to function show() b.show(p); return 0; }
x = 5 y = 4 z = 3
Nota: La forma anterior de acceder a los datos privados de los miembros no es en absoluto una forma recomendada de acceder a los miembros y nunca debe usarse. Además, no significa que la encapsulación no funcione en C++. La idea de hacer miembros privados es evitar cambios accidentales. El cambio anterior a los datos no es accidental. Es un código escrito intencionalmente para engañar al compilador.
Complejidad de tiempo : O(1)
Espacio Auxiliar: O(1)
Este artículo es una contribución de Ashish Kumar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA