Definir el destructor de clases usando el operador Tilde en C++

Jinku Hu 12 octubre 2023
  1. Usar el operador de Tilde ~ para declarar el destructor de clases en C++
  2. Ejecutar el código antes de que el objeto de la clase sea destruido en C++
Definir el destructor de clases usando el operador Tilde en C++

Este artículo demostrará múltiples métodos sobre cómo definir el destructor de clases utilizando el operador de tilde en C++.

Usar el operador de Tilde ~ para declarar el destructor de clases en C++

El destructor es una función especial de los miembros que se encarga de la distribución de los recursos del objeto de la clase. A diferencia de los constructores de clases, sólo tiene una función de destructor para una clase determinada. El destructor de la clase se declara con el mismo nombre de la clase más el prefijo ~ operador de tilde.

En la mayoría de los casos, es necesario definir el destructor de la clase si hay miembros de datos que deben ser asignados en la memoria dinámica. El código debe tratar explícitamente la asignación de estos miembros en la función de destructor. El siguiente ejemplo demuestra la clase CustomString que es sólo el envoltorio de la std::string. La idea es definir una clase con un constructor que asigne memoria en un puntero str, lo que implica que la clase requiere que se defina el destructor. Nótese que CustomString tiene dos constructores - uno de ellos es un constructor de copia.

#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class CustomString {
 public:
  explicit CustomString(const string &s = string()) : str(new string(s)) {}

  CustomString(const CustomString &p) : str(new string(*p.str)) {}

  ~CustomString() { delete str; }

  string &getString() { return *str; };

 private:
  string *str;
};

int main() {
  CustomString str1("Hello There!");
  CustomString str2(str1);

  cout << "str1: " << str1.getString() << endl;
  cout << "str2: " << str2.getString() << endl << endl;
}

Producción :

str1: Hello There!
str2: Hello There!

Ejecutar el código antes de que el objeto de la clase sea destruido en C++

Como muestra el método anterior, un destructor de clase es responsable de limpiar la memoria de los miembros de los datos. Aunque, los miembros de la clase son a menudo sólo los tipos de datos habituales declarados en la pila del programa. En ese caso, el destructor puede no ser declarado explícitamente por el programador, pero el compilador define el llamado destructor sintetizado.

Generalmente, los miembros de la clase se destruyen después de que se ejecuta el código de la función del destructor; así, podemos demostrar cómo la instancia de la clase StringArray se sale del ámbito de aplicación y, por lo tanto, imprimir en la consola el texto correspondiente.

#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class StringArray {
 public:
  StringArray() : vec(), init(new int[10]){};
  ~StringArray() {
    delete[] init;
    cout << "printed from destructor" << endl;
  }

  string getString(int num) {
    if (vec.at(num).c_str()) {
      return vec.at(num);
    } else {
      return string("NULL");
    }
  };

  void addString(const string& s) { vec.push_back(s); };

  uint64_t getSize() { return vec.size(); };

 private:
  vector<string> vec;
  int* init;
};

int main() {
  StringArray arr;

  arr.addString("Hello there 1");
  arr.addString("Hello there 2");

  cout << "size of arr: " << arr.getSize() << endl;
  cout << "arr[0]: " << arr.getString(0) << endl;
}

Producción :

size of arr: 2
arr[0]: Hello there 1
printed from destructor
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Class