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;
}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.