AnyCompiler

Encapsulation

Marcar un miembro como private evita que código fuera de la class lo toque directamente — la class puede entonces garantizar sus propios invariantes, ya que la única forma de cambiar su estado es a través de los methods que ella decide exponer. Un method marcado const promete no modificar el object sobre el que se llama, algo que el compilador comprueba y hace cumplir.

#include <iostream>
using namespace std;

class BankAccount {
private:
    double balance;

public:
    BankAccount(double initial) {
        balance = initial;
    }

    double getBalance() const {
        return balance;
    }

    void deposit(double amount) {
        balance += amount;
    }
};

int main() {
    BankAccount account(100.0);
    account.deposit(50.0);
    cout << "Balance: " << account.getBalance() << endl;
    return 0;
}
Output
Balance: 150

balance nunca puede fijarse a un valor inválido desde fuera de BankAccount, porque nada fuera de la class puede acceder a él directamente — cada cambio tiene que pasar por deposit, que la class controla por completo.

Siguiente: inheritance y polymorphism — construir una jerarquía de classes, y despachar al override correcto en tiempo de ejecución.

Practice exercise

Define una class Temperature con un private double celsius, un constructor que lo fije, y un const method getFahrenheit() que devuelva celsius * 9.0 / 5.0 + 32.0. Crea un Temperature con celsius 100.0 e imprime su valor en Fahrenheit.