Accedi ai membri privati di una classe in C++

  1. Usa lo specificatore di accesso private per incapsulare i membri della classe in C++
  2. 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::vector; using std::string;

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::vector; using std::string;

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

Articolo correlato - C++ Class

  • Chiama un distruttore esplicitamente in C++