Acceder a la variable privada en C++

Anam Javed 12 octubre 2023
  1. Acceder a la variable privada en C++
  2. Acceda a la variable privada en C++ usando funciones miembro
  3. Acceda a variables privadas en C++ usando funciones de friend
  4. Acceda a la variable privada en C++ usando punteros
  5. Conclusión
Acceder a la variable privada en C++

Este artículo analiza las variables privadas de C++ y cómo acceder a ellas en C++.

Acceder a la variable privada en C++

La encapsulación protege los datos confidenciales y esenciales de usuarios no autorizados. La palabra clave privado se utiliza para lograr este fenómeno.

Junto con la encapsulación, el concepto de ocultación de datos también se implementa en C++. La variable declarada con la palabra clave privada en C++ indica que solo las funciones miembro de su clase pueden acceder a ella.

Cualquier objeto o función no puede acceder directamente a él.

#include <iostream>
using namespace std;

class shape {
 private:
  double r;

 public:
  void area(double rr) {
    r = rr;

    double ar = 3.14 * r * r;

    cout << "Radius is: " << r << endl;
    cout << "Area is: " << ar;
  }
};

int main() {
  shape obj;
  obj.area(1.5);

  return 0;
}

Producción :

Radius is: 1.5
Area is: 7.065

Aparte de una función friend o función miembro de la clase, ninguna entidad puede acceder a los datos privados miembro de la clase. Aquí, la variable r es accedida por la función miembro de la clase area().

La función area() calcula el área del círculo accediendo al miembro de datos privados de la clase. Y el objeto de la clase se crea en la función principal de la clase.

A través de este objeto se accede a la función miembro de la clase y se calcula el área del círculo.

La función friend por sí sola no es la forma de acceder a los datos privados de los miembros. Además de eso, también se accede a las variables privadas fuera de una clase usando punteros.

Este método de usar punteros para acceder a miembros de datos privados es una laguna en C++. Siga leyendo para obtener más información al respecto.

Acceda a la variable privada en C++ usando funciones miembro

No se puede acceder a una variable o función miembro privada en C++ ni verla fuera de la clase. El concepto principal de C++ es su característica única de seguridad de datos.

Un miembro de datos privados solo puede ser accedido por la clase en la que se crea y la función friend de su clase.

Concéntrese en el siguiente ejemplo para aprender cómo las funciones miembro de la clase acceden a los miembros de datos.

#include <iostream>
using namespace std;

class Emp {
 private:
  int sal;

 public:
  void setSal(int s) { sal = s; }

  int getSal() { return sal; }
};

int main() {
  Emp myObj;
  myObj.setSal(50000);
  cout << myObj.getSal();
  return 0;
}

Producción :

50000

En el programa anterior, la clase emp tiene miembros privados y públicos. sal es una variable privada a la que pueden acceder dos funciones miembro de clase: setSal() y getSal().

setSal() está inicializando el valor del miembro de datos privados sal, y getSal() devuelve el valor del miembro de datos privados sal. Finalmente, en el método principal, se crea el objeto de la clase.

El objeto myObj accede a la función miembro de la clase, setSal(), para pasar el valor al miembro de datos privados sal. Por último, el objeto de clase accede a getSal() para devolver el miembro de datos sal.

Por defecto, todos los miembros de una clase son privados; por ejemplo, en la siguiente clase, w es un miembro privado. Por lo tanto, se considerará un miembro de datos privados hasta que lo etiquetes como público o protegido.

class B {
  double w;

 public:
  double len;
  void setW(double wid);
  double get(void);
};

En tiempo real, los datos se definen en el área privada y las funciones de los miembros en el área pública para llamarlos desde fuera de la clase, como se muestra en el siguiente programa.

#include <iostream>

using namespace std;

class B {
 public:
  double len;
  void setW(double wid);
  double getW(void);

 private:
  double w;
};

double B::getW(void) { return w; }

void B::setW(double wid) { w = wid; }

int main() {
  B box;

  box.len = 10.0;
  cout << "Length: " << box.len << endl;

  box.setW(10.0);
  cout << "Width: " << box.getW() << endl;

  return 0;
}

En el programa anterior, la clase B tiene miembros privados y públicos. Aquí, w es una variable privada a la que puede acceder la función miembro de dos clases: setW() y getW().

setW() inicializa el valor del miembro de datos privados w, y getW() devuelve el valor del miembro de datos privados w. El cuadro de objeto accede a la función miembro de la clase.

Se puede acceder a la variable pública len a través del cuadro de objeto y se inicializa con un valor. setW() asigna el valor dado al miembro de datos privados w.

Finalmente, el cuadro de objeto de clase accede a getW() para devolver el miembro de datos w.

Producción :

Length: 10
Width: 10

Acceda a variables privadas en C++ usando funciones de friend

Una función de friend está en la parte privada o pública de la clase. Se puede llamar una función miembro normal sin usar el objeto.

El objeto de clase no lo llama porque no está dentro del alcance de la clase. Además, no puede acceder directamente a los miembros de datos privados y protegidos de la clase.

La función friend usa el objeto de la clase y accede a los miembros usando el operador punto. Puede ser una función global o un miembro de otra clase.

#include <iostream>
using namespace std;

class Dist {
 private:
  int m;

  friend int add(Dist);

 public:
  Dist() : m(0) {}
};

int add(Dist d) {
  d.m += 5;
  return d.m;
}

int main() {
  Dist D;
  cout << "Distance: " << add(D);
  return 0;
}

Producción :

Distance = 5

En el programa anterior, podemos ver una clase Dist con miembros privados m. Tenemos un constructor público que está inicializando los valores de m.

Luego, hay una función de friend add(), que calcula la distancia usando m. La función add() es una función friend que no está dentro del alcance de la clase.

En el método principal se crea un objeto de la clase y se pasa la función add(). La función add() calcula la distancia y muestra el resultado.

Clase friend en C++

Una clase friend es como funciones amigas que se pueden crear. La clase friend puede acceder a los miembros secretos y protegidos de la clase de la que es amiga.

Similar a las funciones de friend, hay una clase de friend. Puede acceder a miembros de clases privados y protegidos de los que es friend.

Sintaxis:

class X {
  Data members;
  Member Functions;

  friend class Y;
};

class B {
  ……..
};

Como se muestra en la sintaxis, la clase X es un friend de la clase Y. Esto significa que la clase Y puede acceder a los miembros privados y protegidos de la clase X.

Pero esta amistad no es mutua, y la clase X no puede acceder a miembros privados y protegidos de la clase Y. Debemos designar a la clase X como friend de la clase Y.

Además, la amistad no se hereda, por lo que la clase Y no será un friend de las clases secundarias de la clase X.

Ejemplo de clase friend en C++

#include <iostream>
#include <string>
using namespace std;
class Ar {
  int len, br, arr;

 public:
  Ar(int l, int b) {
    len = l;
    br = b;
  };

  void computeArea() { arr = len * br; }

  friend class prClass;
};
class prClass {
 public:
  void prAr(Ar &a) { cout << "Area = " << a.arr; }
};
int main() {
  Ar a(20, 10);
  a.computeArea();
  prClass p;
  p.prAr(a);

  return 0;
}

Producción :

Area = 200

En el programa anterior, hay dos clases. La clase Ar calcula el área utilizando las variables len y br.

Esta clase tiene tres miembros de datos privados: arr, len y br. La otra clase creada es prClass, que imprime el área final calculada por la función miembro computeArea de la clase Ar.

Debido a que todos los miembros de datos son privados, necesitamos hacer que prClass sea un friend de la clase Ar para imprimir el resultado. El objeto de clase Ar se crea dentro de la función principal.

Se realiza el cálculo del área y se pasa el objeto de la clase Ar a la función prClass. Esta función se llama prAr, que muestra el área.

Contras de usar una función friend para acceder a variables privadas en C++

La característica más importante de C++ es la encapsulación, es decir, una agrupación de datos y funciones. Los miembros de datos y las funciones miembro trabajan en los datos juntos para que ninguna función o clase externa pueda acceder a los datos.

La función de encapsulación se ve comprometida debido a que las funciones o clases de friend pueden acceder a los miembros privados de otra clase. La seguridad de los datos está en peligro.

Acceda a la variable privada en C++ usando punteros

Los punteros acceden a los datos sin una función de friend o miembro de clase.

#include <bits/stdc++.h>
using namespace std;

class Hello {
 private:
  int c;
  int d;
};

int main() {
  Hello a;
  int* q = (int*)&a;
  *q = 4;
  q++;
  *q = 5;
  q--;
  cout << endl << "c = " << *q;
  q++;
  cout << endl << "d = " << *q;
  return 0;
}

Producción :

c = 4
d = 5

En el programa anterior, a es un objeto de la clase Hello. La dirección del objeto de clase a se asigna al puntero entero q mediante encasillamiento.

El puntero q luego apunta al miembro privado c. El valor entero se asigna a *q, que es c.

Luego se aumenta la dirección del objeto a y accediendo a la ubicación de memoria se le asigna el valor 5 a d. La declaración q-- establece la ubicación de memoria de c.

Usando la instrucción cout, se muestra c.

Conclusión

En este artículo, hemos discutido el acceso a una variable privada en C++. Aprendimos sobre los diversos métodos para acceder a miembros privados en C++.

Además, con muchos ejemplos, discutimos el concepto de funciones y punteros friend en C++. Una cosa importante a tener en cuenta es que los objetos no se pueden crear en una clase cuyas funciones miembro también son privadas.

Teniendo esto en cuenta, esperamos que haya disfrutado leyendo este artículo. Estén atentos para más artículos informativos.