Usar private vs. protected en C++
-
Usar la propiedad
private
para denotar los miembros de la clase inaccesibles a los usuarios de la clase en C++ -
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
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
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