Introducció
En aquest tema, explorarem dos conceptes fonamentals de la Programació Orientada a Objectes (POO): l'encapsulació i l'abstracció. Aquests conceptes ajuden a organitzar i gestionar el codi de manera més eficient i segura.
Encapsulació
Què és l'Encapsulació?
L'encapsulació és el procés de restringir l'accés a certs components d'un objecte i només exposar aquells que són necessaris per a l'ús extern. Això es fa per protegir les dades i assegurar que només es puguin modificar de maneres controlades.
Beneficis de l'Encapsulació
- Seguretat: Protegeix les dades de modificacions no autoritzades.
- Modularitat: Facilita la divisió del codi en mòduls més petits i manejables.
- Mantenibilitat: Simplifica la modificació i actualització del codi.
Implementació de l'Encapsulació en C++
En C++, l'encapsulació es realitza utilitzant modificadors d'accés com private
, protected
i public
.
#include <iostream> using namespace std; class Rectangle { private: double length; double width; public: // Constructor Rectangle(double l, double w) { length = l; width = w; } // Mètode per calcular l'àrea double area() { return length * width; } // Mètode per establir la longitud void setLength(double l) { if (l > 0) { length = l; } } // Mètode per obtenir la longitud double getLength() { return length; } }; int main() { Rectangle rect(10.0, 5.0); cout << "Àrea: " << rect.area() << endl; rect.setLength(15.0); cout << "Nova longitud: " << rect.getLength() << endl; cout << "Nova àrea: " << rect.area() << endl; return 0; }
Explicació del Codi
- Modificadors d'Accés:
private
restringeix l'accés a les variableslength
iwidth
només dins de la classeRectangle
. - Mètodes Públics:
setLength
igetLength
són mètodes públics que permeten modificar i accedir a la variablelength
de manera controlada.
Abstracció
Què és l'Abstracció?
L'abstracció és el procés de simplificar un sistema complex ocultant els detalls innecessaris i exposant només les parts rellevants. Això ajuda a reduir la complexitat i facilita la comprensió i l'ús del sistema.
Beneficis de l'Abstracció
- Simplicitat: Redueix la complexitat mostrant només la informació essencial.
- Reutilització: Facilita la reutilització del codi en diferents contextos.
- Mantenibilitat: Simplifica la modificació i actualització del codi.
Implementació de l'Abstracció en C++
En C++, l'abstracció es pot aconseguir mitjançant l'ús de classes i interfícies.
#include <iostream> using namespace std; // Classe abstracta class Shape { public: // Mètode purament virtual virtual double area() = 0; }; class Circle : public Shape { private: double radius; public: Circle(double r) { radius = r; } double area() override { return 3.14159 * radius * radius; } }; int main() { Circle circle(5.0); cout << "Àrea del cercle: " << circle.area() << endl; return 0; }
Explicació del Codi
- Classe Abstracta:
Shape
és una classe abstracta amb un mètode purament virtualarea()
. - Classe Derivada:
Circle
hereta deShape
i implementa el mètodearea()
.
Exercicis Pràctics
Exercici 1: Encapsulació
Crea una classe BankAccount
amb les següents característiques:
- Variables privades:
accountNumber
,balance
. - Mètodes públics:
deposit(double amount)
,withdraw(double amount)
,getBalance()
.
Solució
#include <iostream> using namespace std; class BankAccount { private: int accountNumber; double balance; public: BankAccount(int accNum, double bal) { accountNumber = accNum; balance = bal; } void deposit(double amount) { if (amount > 0) { balance += amount; } } void withdraw(double amount) { if (amount > 0 && amount <= balance) { balance -= amount; } } double getBalance() { return balance; } }; int main() { BankAccount account(12345, 1000.0); account.deposit(500.0); cout << "Saldo: " << account.getBalance() << endl; account.withdraw(200.0); cout << "Saldo: " << account.getBalance() << endl; return 0; }
Exercici 2: Abstracció
Crea una classe abstracta Vehicle
amb un mètode purament virtual move()
. Implementa dues classes derivades Car
i Bicycle
que heretin de Vehicle
i implementin el mètode move()
.
Solució
#include <iostream> using namespace std; class Vehicle { public: virtual void move() = 0; }; class Car : public Vehicle { public: void move() override { cout << "El cotxe es mou per carretera." << endl; } }; class Bicycle : public Vehicle { public: void move() override { cout << "La bicicleta es mou per carretera." << endl; } }; int main() { Car car; Bicycle bicycle; car.move(); bicycle.move(); return 0; }
Resum
En aquest tema, hem après sobre l'encapsulació i l'abstracció, dos conceptes clau de la Programació Orientada a Objectes. Hem vist com aquests conceptes ajuden a organitzar i gestionar el codi de manera més eficient i segura. També hem implementat exemples pràctics per reforçar els conceptes apresos. En el proper tema, explorarem la programació orientada a objectes amb més profunditat, incloent-hi herència i polimorfisme.
Curs de Programació en C++
Mòdul 1: Introducció al C++
- Introducció al C++
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Entrada i Sortida
Mòdul 2: Estructures de Control
Mòdul 3: Funcions
- Introducció a les Funcions
- Paràmetres de Funció i Tipus de Retorn
- Sobrecàrrega de Funcions
- Recursivitat
Mòdul 4: Arrays i Strings
Mòdul 5: Punteres i Referències
- Introducció als Punteres
- Aritmètica de Punteres
- Punteres i Arrays
- Referències
- Assignació Dinàmica de Memòria
Mòdul 6: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Constructors i Destructors
- Herència
- Polimorfisme
- Encapsulació i Abstracció
Mòdul 7: Temes Avançats
- Plantilles
- Gestió d'Excepcions
- Entrada/Sortida de Fitxers
- Biblioteca de Plantilles Estàndard (STL)
- Expressions Lambda
- Multifil