Usa i membri delle classi private e protette in C++

Jinku Hu 12 ottobre 2023
  1. Usa la proprietà private per indicare i membri della classe inaccessibili agli utenti della classe in C++
  2. Utilizzare la proprietà protected per indicare i membri della classe accessibili alle funzioni dei membri della classe derivata o della classe amico
Usa i membri delle classi private e protette in C++

Questo articolo mostrerà diversi metodi su come usare correttamente i membri della classe private e protected in C++.

Usa la proprietà private per indicare i membri della classe inaccessibili agli utenti della classe in C++

La parola chiave private è una delle parti fondamentali del linguaggio C++ per implementare le funzionalità di incapsulamento. L’obiettivo principale dell’incapsulamento è creare un’interfaccia forzata per gli utenti della classe e limitare l’accesso diretto solo a membri specifici. Si noti che la definizione dell’interfaccia della classe implica che l’utente della classe non debba modificare o accedere direttamente ai membri dei dati, ma piuttosto chiamare metodi pubblici progettati per eseguire queste operazioni sugli oggetti dati.

Ci sono generalmente tre parole chiave per il controllo degli accessi: public, private e protected. I membri definiti dopo la proprietà public sono accessibili a tutti gli utenti della classe. D’altra parte, lo specificatore private definisce i membri a cui possono accedere solo le funzioni membro della classe. Nell’esempio seguente, il codice della funzione main può dichiarare una variabile di tipo CustomString, ma per accedere al suo membro str il codice deve chiamare il metodo getString, definito come proprietà 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);
}

Produzione:

str1: Hello There 1

Utilizzare la proprietà protected per indicare i membri della classe accessibili alle funzioni dei membri della classe derivata o della classe amico

Un’altra parola chiave disponibile per il controllo dell’accesso è una proprietà protected che rende i membri dichiarati dopo accessibili alle funzioni dei membri della classe, ai membri delle classi derivate e persino alle classi amiche. Notare che i due di quelli successivi non possono accedere ai membri protected direttamente dall’oggetto della classe base ma piuttosto dall’oggetto della classe derivata. Il prossimo esempio mostra la classe CustomSentence che deriva da CustomString, ma il membro num di quest’ultima classe è un membro protected. Pertanto, non è possibile accedervi dall’oggetto CustomString. Vale a dire, la funzione getSize non fa parte della classe CustomString e solo gli oggetti CustomSentence possono recuperare il valore num chiamando il metodo.

#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);
}

Produzione:

str1: Hello There 1
sent1: Hello There 2
size: 13
Autore: 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

Articolo correlato - C++ Class