Lección 2 · 2 de 20
Encapsulación e inicialización · C++
Proteja los datos de una clase de C++ con private y getters, e inicialice sus miembros con una lista: un termostato que nunca sale de su rango.

La encapsulación consiste en ocultar los datos y dejar que solo la propia clase los cambie. En una class todo es privado por defecto, así que room_, target_, min_, max_ y changes_ no se ven desde main: escribir living.target_ = 99; daría un error de compilación. El guion bajo final es una costumbre para reconocer los miembros.
Lo que va después de public: es la interfaz de la clase. set() es la única forma de cambiar la temperatura, y por eso puede garantizar que siempre esté entre min_ y max_: los 35 grados del salón se quedan en 28 y los 10 del despacho suben a 18. target() es un getter: deja leer el valor, pero no cambiarlo.
El constructor usa una lista de inicialización: lo que va tras los dos puntos, : room_(room), target_(target), min_(min), max_(max), construye cada miembro directamente con su valor, en vez de crearlo vacío y asignarlo después. Es obligatoria para los miembros const, como min_ y max_, que no se pueden asignar en el cuerpo.
Los miembros se inicializan en el orden en que están declarados, no en el de la lista, así que conviene escribirla en ese mismo orden (con -Wall, el compilador avisa si no). int changes_ = 0; es un inicializador por defecto del miembro, válido para cualquier constructor que no diga otra cosa.
Los parámetros min = 15 y max = 28 tienen valores por defecto: el salón se crea con dos argumentos y usa ese rango, y el despacho pasa los cuatro para limitarse a 18–24.
Código · main.cpp
#include <iostream>#include <string>class Thermostat { // A class is private by default: only its own methods can touch these. std::string room_; double target_; const double min_, max_; // const members must be set in the list int changes_ = 0; // default member initializerpublic: // Initializer list: members are built directly, in declaration order. Thermostat(std::string room, double target, double min = 15, double max = 28) : room_(room), target_(target), min_(min), max_(max) {} // The only way to change the target, so it always stays in range. void set(double t) { target_ = t < min_ ? min_ : (t > max_ ? max_ : t); ++changes_; } double target() const { return target_; } // read-only access void show() const { std::cout << room_ << ": " << target_ << " C (changes: " << changes_ << ")\n"; }};int main() { Thermostat living("Living room", 21); Thermostat office("Office", 20, 18, 24); living.show(); living.set(35); // too hot: clamped to 28 office.set(10); // too cold: clamped to 18 living.show(); office.show(); std::cout << "Average: " << (living.target() + office.target()) / 2 << " C\n";}Salida · c++ -std=c++17 main.cpp -o main && ./main
Living room: 21 C (changes: 0) Living room: 28 C (changes: 1) Office: 18 C (changes: 1) Average: 23 C
Para recordar
- En una
class, los miembros son privados salvo que se pongan traspublic:. - Los datos privados solo se cambian con métodos que los validan.
- Un getter
constdeja leer sin dejar modificar. - La lista de inicialización construye los miembros; es obligatoria para los
const. - Escriba la lista en el mismo orden en que se declaran los miembros.
Ejercicio
Añada un método warmer() que suba medio grado usando set(target_ + 0.5) y llámelo veinte veces en el despacho. Compruebe que nunca pasa de 24.