AnyCompiler

Encapsulation

Marcar um membro como private impede que código fora da class o toque diretamente — a class pode então garantir seus próprios invariantes, já que a única forma de mudar seu estado é através dos methods que ela escolhe expor. Um method marcado const promete não modificar o object sobre o qual é chamado, algo que o compilador verifica e impõe.

#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 pode ser definido para um valor inválido de fora de BankAccount, porque nada fora da class pode alcançá-lo diretamente — toda mudança tem que passar por deposit, que a class controla completamente.

A seguir: inheritance e polymorphism — construir uma hierarquia de classes, e despachar para o override correto em tempo de execução.

Practice exercise

Defina uma class Temperature com um private double celsius, um constructor que o defina, e um const method getFahrenheit() que retorne celsius * 9.0 / 5.0 + 32.0. Crie um Temperature com celsius 100.0 e imprima seu valor em Fahrenheit.