Accedi ai membri privati di una classe in C++
-
Usa lo specificatore di accesso
private
per incapsulare i membri della classe in C++ -
Usa le funzioni
public
per recuperare i membri privati di una classe in C++
Questo articolo spiegherà diversi metodi su come accedere ai membri privati di una classe in C++.
Usa lo specificatore di accesso private
per incapsulare i membri della classe in C++
Gli specificatori di accesso vengono impiegati per implementare una caratteristica fondamentale della programmazione orientata agli oggetti, chiamata incapsulamento. Di conseguenza, limitiamo l’accesso diretto a membri di dati specifici della classe e essenzialmente costruiamo un’interfaccia per operare sui dati della classe. Il C++ fornisce diverse parole chiave di specificazione dell’accesso come: public
, private
e protected
, che di solito precedono i membri della classe che devono essere qualificati con l’accessibilità corrispondente.
I membri definiti dopo lo specificatore private
sono accessibili solo alle funzioni membro e non possono essere indicati direttamente dal codice che utilizza la classe. Una classe di solito è costruita pensando a due lati: il progettista della classe e l’utente della classe. Quest’ultimo è solitamente quello che è interessato dall’incapsulamento. Se il programmatore definisce i membri prima del primo specificatore di accesso, la loro accessibilità è impostata di default su private
quando viene utilizzata la parola chiave class
e public
sulla parola chiave struct
.
Nell’esempio seguente, implementiamo una classe chiamata BaseClass
con due membri di dati stringa dichiarati come private
, quindi per accedere ai valori di questi membri, il progettista della classe dovrebbe includere funzioni public
che li recuperano. Si noti che possiamo rimuovere la parola chiave public
dal codice sottostante e mantenere le funzioni getUsername
e getName
come membri public
.
Un altro vantaggio dell’incapsulamento è la flessibilità di modificare la struttura della classe interna senza preoccuparsi dei problemi di compatibilità del lato utente. Finché l’interfaccia, quindi, le funzioni pubbliche non cambiano, l’utente della classe non ha bisogno di modificare il suo codice.
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class BaseClass {
public:
BaseClass() = default;
explicit BaseClass(string user, string nm)
: username(std::move(user)), name(std::move(nm)) {}
~BaseClass() = default;
string& getUsername() { return username; };
string& getName() { return name; };
private:
string username;
string name;
};
int main() {
BaseClass base("buddy", "Buddy Bean");
cout << "base -> name: " << base.getName() << endl;
cout << "base -> username: " << base.getUsername() << endl;
exit(EXIT_SUCCESS);
}
Produzione:
base -> name: Buddy Bean
base -> username: buddy
Usa le funzioni public
per recuperare i membri privati di una classe in C++
I membri private
possono essere modificati usando le funzioni dell’interfaccia della classe, ad esempio la funzione changeUsername
prende l’argomento string
dall’utente della classe e memorizza il suo valore nel membro private
- username
. Nota che c’è anche una parola chiave friend
che distingue altre classi e funzioni autorizzate ad accedere ai membri private
della classe. Queste funzioni possono essere esterne, non far parte della classe sopra menzionata. Tuttavia, l’uso errato degli specificatori di accesso molto probabilmente si traduce in errori del compilatore.
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class BaseClass {
public:
BaseClass() = default;
explicit BaseClass(string user, string nm)
: username(std::move(user)), name(std::move(nm)) {}
~BaseClass() = default;
void changeUsername(const string& s) { username.assign(s); };
string& getUsername() { return username; };
string& getName() { return name; };
private:
string username;
string name;
};
int main() {
BaseClass base("buddy", "Buddy Bean");
cout << "base -> name: " << base.getName() << endl;
cout << "base -> username: " << base.getUsername() << endl;
base.changeUsername("jolly");
cout << "base -> username: " << base.getUsername() << endl;
exit(EXIT_SUCCESS);
}
Produzione:
base -> name: Buddy Bean
base -> username: buddy
base -> username: jolly
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