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.

  1. 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 classe Rectangle.
  • Inicialització: Els membres width i height s'inicialitzen amb els valors passats com a arguments.
  • Creació de l'Objecte: Rectangle rect(10, 5); crea un objecte rect i invoca el constructor.

  1. 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.

class Rectangle {
public:
    Rectangle() {
        width = 0;
        height = 0;
    }
};

2.2 Constructor Parametritzat

Un constructor que accepta arguments per inicialitzar els membres de la classe.

class Rectangle {
public:
    Rectangle(int w, int h) {
        width = w;
        height = h;
    }
};

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

  1. 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 classe Rectangle.
  • Invocació Automàtica: El destructor es crida automàticament quan l'objecte rect surt de l'àmbit (al final de main).

  1. 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.

  1. 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.

© Copyright 2024. Tots els drets reservats