{
cout << num << "\n";
}
int main()
{
P_example ob, *p; // Объявляем объект и указатель на него.
ob.set_num(1); // Получаем прямой доступ к объекту ob.
ob.show_num();
р = &ob; // Присваиваем указателю р адрес объекта ob.
p->show_num(); // Получаем доступ к объекту ob с помощью указателя.
return 0;
}
Обратите внимание на то, что адрес объекта ob получается путем использования оператора что соответствует получению адреса для переменных любого другого типа.
Как вы знаете, при инкрементации или декрементации указателя он инкрементируется или декрементируется так, чтобы всегда указывать на следующий или предыдущий элемент базового типа. То же самое происходит и при инкрементации или декрементации указателя на объект: он будет указывать на следующий или предыдущий объект. Чтобы проиллюстрировать этот механизм, модифицируем предыдущую программу. Теперь вместо одного объекта ob объявим двухэлементный массив ob типа P_example. Обратите внимание на то, как инкрементируется и декрементируется указатель р для доступа к двум элементам этого массива.
// Инкрементация и декрементация указателя на объект.
#include <iostream>
using namespace std;
class P_example {
int num;
public:
void set_num(int val) {num = val;}
void show_num();
};
void P_example::show_num()
{
cout << num << "\n";
}
int main()
{
P_example ob[2], *p;
ob[0].set_num(10); // прямой доступ к объектам
ob[1].set_num(20);
p = &ob[0]; // Получаем указатель на первый элемент.
p->show_num(); // Отображаем значение элемента ob[0] с помощью указателя.
p++; // Переходим к следующему объекту.
p->show_num(); // Отображаем значение элемента ob[1] с помощью указателя.
p--; // Возвращаемся к предыдущему объекту.
p->show_num(); // Снова отображаем значение элемента ob[0].
return 0;
}
Вот как выглядят результаты выполнения этой программы.
10
20
10
Как будет показано ниже в этой книге, указатели на объекты играют главную роль в реализации одного из важнейших принципов C++: полиморфизма.
На объекты можно ссылаться таким же образом, как и на значения любого другого типа. Для этого не существует никаких специальных инструкций или ограничений. Но, как будет показано в следующей главе, использование ссылок на объекты позволяет справляться с некоторыми специфическими проблемами, которые могут встретиться при использовании классов.
Глава 12: О классах подробнее
В этой главе мы продолжим рассмотрение классов, начатое в главе 11. Здесь вы познакомитесь с "дружественными" функциями, перегрузкой конструкторов, а также с возможностью передачи и возвращения объектов функциями. Кроме того, вы узнаете о существовании специального типа конструктора, именуемого конструктором копии, который используется в случае, когда возникает необходимость в создании копии объекта. Завершает главу описание ключевого слова this.
В C++ существует возможность разрешить доступ к закрытым членам класса функциям, которые не являются членами этого класса. Для этого достаточно объявить эти функции "дружественными" (или "друзьями") по отношению к рассматриваемому классу. Чтобы сделать функцию "другом" класса, включите ее прототип в public-раздел объявления класса и предварите его ключевым словом friend. Например, в этом фрагменте кода функция frnd() объявляется "другом" класса cl.
class cl {
// . . .