Usar private vs. protected en C++

Jinku Hu 12 octubre 2023
  1. Usar la propiedad private para denotar los miembros de la clase inaccesibles a los usuarios de la clase en C++
  2. Usar la propiedad protected para denotar a los miembros de la clase accesibles a las funciones de los miembros de la clase derivada o de la clase amiga
Usar private vs. protected en C++

Este artículo demostrará múltiples métodos sobre cómo usar correctamente los miembros de la clase private contra los de la clase protected en C++.

Usar la propiedad private para denotar los miembros de la clase inaccesibles a los usuarios de la clase en C++

La palabra clave private es una de las partes fundamentales del lenguaje C++ para implementar las características de encapsulación. El objetivo principal de la encapsulación es crear una interfaz reforzada para los usuarios de la clase y restringir el acceso directo sólo a miembros específicos. Nótese que la definición de la interfaz de la clase implica que el usuario de la clase no necesita modificar o acceder a los miembros de datos directamente, sino que llama a los métodos públicos que están diseñados para realizar estas operaciones en los objetos dados.

Generalmente hay tres palabras clave para el control de acceso: public, private y protected. Los miembros definidos después de la propiedad public son accesibles a todos los usuarios de la clase. Por otro lado, el especificador private define los miembros a los que sólo se puede acceder mediante las funciones de miembro de la clase. En el siguiente ejemplo, el código de la función main puede declarar una variable de tipo CustomString, pero para acceder a su miembro str el código necesita llamar al método getString, definido como propiedad public.

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class CustomString {
 public:
  CustomString() = default;
  explicit CustomString(const string& s) : str(s) { num = s.size(); }

  virtual ~CustomString() = default;

  string& getString() { return str; };

 private:
  string str;

 protected:
  int num{};
};

int main() {
  CustomString str1("Hello There 1");

  cout << "str1: " << str1.getString() << endl;

  exit(EXIT_SUCCESS);
}

Producción :

str1: Hello There 1

Usar la propiedad protected para denotar a los miembros de la clase accesibles a las funciones de los miembros de la clase derivada o de la clase amiga

Otra palabra clave disponible para el control de acceso es una propiedad protected que hace que los miembros declarados después sean accesibles a las funciones de los miembros de la clase, a los miembros de la clase derivada e incluso a las clases amigas. Nótese que los dos últimos no pueden acceder a los miembros protected directamente desde el objeto de clase base sino desde el objeto de clase derivado. El siguiente ejemplo demuestra la clase CustomSentence que deriva de la CustomString, pero el miembro num de esta última clase es un miembro protected. Por lo tanto, no se puede acceder a ella desde el objeto CustomString. Es decir, la función getSize no es parte de la clase CustomString, y sólo los objetos CustomSentence pueden recuperar el valor num llamando al método.

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class CustomString {
 public:
  CustomString() = default;
  explicit CustomString(const string& s) : str(s) { num = s.size(); }

  virtual ~CustomString() = default;

  string& getString() { return str; };

 private:
  string str;

 protected:
  int num{};
};

class CustomSentence : public CustomString {
 public:
  CustomSentence() = default;
  explicit CustomSentence(const string& s) : sent(s) { num = s.size(); }
  ~CustomSentence() override = default;

  int getSize() const { return num; };
  string& getSentence() { return sent; };

 private:
  string sent;
};

int main() {
  CustomString str1("Hello There 1");
  CustomSentence sent1("Hello There 2");

  cout << "str1: " << str1.getString() << endl;
  cout << "sent1: " << sent1.getSentence() << endl;
  cout << "size: " << sent1.getSize() << endl;

  exit(EXIT_SUCCESS);
}

Producción :

str1: Hello There 1
sent1: Hello There 2
size: 13
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Class