C++ Указатель на класс

Классы & объекты C++

Указатель на класс C++ похож на указатель на структуру. Чтобы получить доступ к членам через указатель на класс, необходимо использовать оператор доступа к членам->, так же как при доступе через указатель на структуру. Как и все указатели, указатель необходимо инициализировать перед использованием.

В C++ указатель на класс указывает на объект класса. Как и обычные указатели, указатель на класс можно использовать для доступа к переменным-членам и функциям-членам объекта.

Объявление и инициализация указателей на классы

Пример

#include <iostream>

class MyClass {
public:
    int data;

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

int main() {
    // Создать объект класса
    MyClass obj;
    obj.data = 42;

    // Объявление и инициализация указателя на класс
    MyClass *ptr = &obj;

    // Доступ к переменным-членам через указатель
    std::cout << "Данные через указатель: " << ptr->data << std::endl;

    // Вызов функции-члена через указатель
    ptr->display();

    return 0;
}

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

Data via pointer: 42
Data: 42

Динамическое выделение памяти

Указатель на класс также можно использовать для динамического выделения памяти для создания объекта класса:

Пример

#include <iostream>

class MyClass {
public:
    int data;

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

int main() {
    // Динамическое выделение памяти для создания объекта класса
    MyClass *ptr = new MyClass;
    ptr->data = 42;

    // Вызов функции-члена через указатель
    ptr->display();

    // Освобождение динамически выделенной памяти
    delete ptr;

    return 0;
}

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

Data: 42

Указатели на классы как параметры функций

Указатель на класс можно передать в качестве параметра функции:

Пример

#include <iostream>

class MyClass {
public:
    int data;

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

// Функция принимает указатель на класс в качестве параметра
void processObject(MyClass *ptr) {
    ptr->display();
}

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

    // Передать указатель на класс функции
    processObject(&obj);

    return 0;
}

Пример

Следующий пример помогает лучше понять концепцию указателей на классы:

Пример

#include <iostream>
 
using namespace std;

class Box
{
   public:
      // Определение конструктора
      Box(double l=2.0, double b=2.0, double h=2.0)
      {
         cout <<"Конструктор вызван." << endl;
         length = l;
         breadth = b;
         height = h;
      }
      double Volume()
      {
         return length * breadth * height;
      }
   private:
      double length;     // Длина коробки
      double breadth;    // Ширина коробки
      double height;     // Высота коробки
};

int main(void)
{
   Box Box1(3.3, 1.2, 1.5);    // Объявить box1
   Box Box2(8.5, 6.0, 2.0);    // Объявить box2
   Box *ptrBox;                // Объявить указатель на класс.

   // Сохранить адрес первого объекта
   ptrBox = &Box1;

   // Теперь попробуйте использовать оператор доступа к членам для доступа к членам
   cout << "Объём Box1: " << ptrBox->Volume() << endl;

   // Сохраните адрес второго объекта
   ptrBox = &Box2;

   // Теперь попробуйте использовать оператор доступа к членам для доступа к членам
   cout << "Объём Box2: " << ptrBox->Volume() << endl;
 
   return 0;
}

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

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

Классы & объекты C++

Другие расширения