En aquest tema, explorarem els constructors i destructors en C++, que són fonamentals per a la gestió de la vida dels objectes en la programació orientada a objectes (POO). Aprendrem què són, com es defineixen i utilitzen, i veurem exemples pràctics per entendre millor el seu funcionament.
- Què és un Constructor?
Un constructor és una funció especial d'una classe que s'invoca automàticament quan es crea un objecte d'aquesta classe. El seu propòsit principal és inicialitzar els membres de l'objecte.
Característiques dels Constructors:
- Nom: Té el mateix nom que la classe.
- No té tipus de retorn: Ni tan sols
void
. - Es pot sobrecarregar: Es poden tenir múltiples constructors amb diferents paràmetres.
Exemple de Constructor:
#include <iostream> using namespace std; class Rectangle { private: int width, height; public: // Constructor Rectangle(int w, int h) { width = w; height = h; } int area() { return width * height; } }; int main() { Rectangle rect(10, 5); cout << "Area: " << rect.area() << endl; return 0; }
Explicació:
- Definició del Constructor:
Rectangle(int w, int h)
és el constructor de la classeRectangle
. - Inicialització: Els membres
width
iheight
s'inicialitzen amb els valors passats com a arguments. - Creació de l'Objecte:
Rectangle rect(10, 5);
crea un objecterect
i invoca el constructor.
- Tipus de Constructors
2.1 Constructor per Defecte
Un constructor que no té paràmetres. Si no es defineix cap constructor, el compilador proporciona un constructor per defecte.
2.2 Constructor Parametritzat
Un constructor que accepta arguments per inicialitzar els membres de la classe.
2.3 Constructor de Còpia
Un constructor que crea un nou objecte com a còpia d'un objecte existent.
class Rectangle { public: Rectangle(const Rectangle &rect) { width = rect.width; height = rect.height; } };
- Què és un Destructor?
Un destructor és una funció especial d'una classe que s'invoca automàticament quan un objecte d'aquesta classe es destrueix. El seu propòsit principal és alliberar recursos que l'objecte hagi pogut adquirir durant la seva vida.
Característiques dels Destructors:
- Nom: Té el mateix nom que la classe, però precedit per una tilde (
~
). - No té tipus de retorn: Ni tan sols
void
. - No té paràmetres: No es pot sobrecarregar.
Exemple de Destructor:
#include <iostream> using namespace std; class Rectangle { private: int width, height; public: // Constructor Rectangle(int w, int h) { width = w; height = h; } // Destructor ~Rectangle() { cout << "Destructor called" << endl; } int area() { return width * height; } }; int main() { Rectangle rect(10, 5); cout << "Area: " << rect.area() << endl; return 0; }
Explicació:
- Definició del Destructor:
~Rectangle()
és el destructor de la classeRectangle
. - Invocació Automàtica: El destructor es crida automàticament quan l'objecte
rect
surt de l'àmbit (al final demain
).
- Exercicis Pràctics
Exercici 1: Constructor i Destructor Bàsics
Objectiu: Crear una classe Circle
amb un constructor i un destructor.
#include <iostream> using namespace std; class Circle { private: double radius; public: // Constructor Circle(double r) { radius = r; cout << "Constructor called" << endl; } // Destructor ~Circle() { cout << "Destructor called" << endl; } double area() { return 3.14 * radius * radius; } }; int main() { Circle c(5.0); cout << "Area: " << c.area() << endl; return 0; }
Solució:
- Constructor: Inicialitza
radius
amb el valor passat com a argument. - Destructor: Imprimeix un missatge quan es destrueix l'objecte.
Exercici 2: Constructor de Còpia
Objectiu: Afegir un constructor de còpia a la classe Circle
.
#include <iostream> using namespace std; class Circle { private: double radius; public: // Constructor Circle(double r) { radius = r; cout << "Constructor called" << endl; } // Constructor de còpia Circle(const Circle &c) { radius = c.radius; cout << "Copy constructor called" << endl; } // Destructor ~Circle() { cout << "Destructor called" << endl; } double area() { return 3.14 * radius * radius; } }; int main() { Circle c1(5.0); Circle c2 = c1; // Invoca el constructor de còpia cout << "Area of c1: " << c1.area() << endl; cout << "Area of c2: " << c2.area() << endl; return 0; }
Solució:
- Constructor de Còpia: Inicialitza
radius
amb el valor de l'objecte passat com a argument.
- Resum
En aquesta secció, hem après sobre els constructors i destructors en C++. Hem vist com es defineixen i utilitzen per inicialitzar i alliberar recursos dels objectes. També hem explorat diferents tipus de constructors, incloent-hi el constructor per defecte, el constructor parametritzat i el constructor de còpia. Finalment, hem practicat amb exercicis per reforçar els conceptes apresos.
En el següent tema, explorarem la herència, un concepte clau en la programació orientada a objectes que permet crear noves classes a partir de classes existents.
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