C++ Puntero a una clase

C++ 类 & 对象Clases y objetos en C++

Un puntero a una clase de C++ es similar a un puntero a una estructura; para acceder a los miembros de un puntero a una clase, se necesita utilizar el operador de acceso a miembros.->, como cuando se accede a un puntero a una estructura. Como con todos los punteros, debe inicializar el puntero antes de usarlo.

En C++, un puntero a una clase apunta a un objeto de una clase; similar a un puntero normal, un puntero a una clase se puede utilizar para acceder a las variables miembro y funciones miembro del objeto.

Declaración e inicialización de un puntero a una clase

Ejemplos

#include <iostream>

class MyClass {
public:
    int data;

    void display() {
        std::cout << "Data: " << data << std::endl;
    }
};

int main() {
    // Crear objeto de clase
    MyClass obj;
    obj.data = 42;

    // Declarar e inicializar un puntero a la clase
    MyClass *ptr = &obj;

    // Acceder a las variables miembro a través del puntero
    std::cout << "Data via pointer: " << ptr->data << std::endl;

    // Llamar a la función miembro a través del puntero
    ptr->display();

    return 0;
}

Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:

Data via pointer: 42
Data: 42

Asignación dinámica de memoria

Un puntero a una clase también se puede usar para asignar memoria dinámicamente y crear objetos de clase:

Ejemplos

#include <iostream>

class MyClass {
public:
    int data;

    void display() {
        std::cout << "Data: " << data << std::endl;
    }
};

int main() {
    // Crear objeto de clase con asignación dinámica de memoria
    MyClass *ptr = new MyClass;
    ptr->data = 42;

    // Llamar a la función miembro a través del puntero
    ptr->display();

    // Liberar la memoria asignada dinámicamente
    delete ptr;

    return 0;
}

Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:

Data: 42

Puntero a clase como parámetro de función

Un puntero a una clase se puede pasar como parámetro de función:

Ejemplos

#include <iostream>

class MyClass {
public:
    int data;

    void display() {
        std::cout << "Data: " << data << std::endl;
    }
};

// La función acepta un puntero a la clase como parámetro
void processObject(MyClass *ptr) {
    ptr->display();
}

int main() {
    MyClass obj;
    obj.data = 42;

    // Pasar a la función el puntero a la clase
    processObject(&obj);

    return 0;
}

Ejemplos

El siguiente ejemplo ayuda a comprender mejor el concepto de puntero a una clase:

Ejemplos

#include <iostream>
 
using namespace std;

class Box
{
   public:
      // Definición del constructor
      Box(double l=2.0, double b=2.0, double h=2.0)
      {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
      }
      double Volume()
      {
         return length * breadth * height;
      }
   private:
      double length;     // Length of a box
      double breadth;    // Breadth of a box
      double height;     // Height of a box
};

int main(void)
{
   Box Box1(3.3, 1.2, 1.5);    // Declare box1
   Box Box2(8.5, 6.0, 2.0);    // Declare box2
   Box *ptrBox;                // Declare pointer to a class.

   // Guardar la dirección del primer objeto
   ptrBox = &Box1;

   // Ahora intentar usar el operador de acceso a miembros para acceder a los miembros
   cout << "Volume of Box1: " << ptrBox->Volume() << endl;

   // Guardar la dirección del segundo objeto
   ptrBox = &Box2;

   // Ahora intentar usar el operador de acceso a miembros para acceder a los miembros
   cout << "Volume of Box2: " << ptrBox->Volume() << endl;
 
   return 0;
}

Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:

Constructor called.
Constructor called.
Volume of Box1: 5.94
Volume of Box2: 102

C++ 类 & 对象Clases y objetos en C++

Otras extensiones