¿Podemos acceder a los datos privados de los miembros de una clase sin usar una función de miembro o amigo en C++?

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;
}
Producción

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;
}
Producción

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;
}
Producción: 

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *