Деструктор

Конструкторы

Снова ввод значений

Ввод значений последовательности

seq.input(0); // нулевое значение

seq.input(1); // первое значение

...

seq.print(); // печать последовательности

CBitSequence * pseq = &seq; // указатель на объект

pseq->input(3); // косвенный выбор

pseq->input(4);

pseq->print(); // печать после модификации

(*pseq).input_all(); // уточнение имени с разыменованием указателя

(*pseq).print();

...

Эскиз определения класса CBitSequence представлен ниже (определение класса, безусловно, далеко от «совершенства», но для понимания способов доступа к компонентам объектов вполне достаточно).

class CBitSequence {

public:

explicit CBitSequence(int len);

CBitSequence(const CBitSequence &);

~CBitSequence() { delete[] __items; }

void print();// печать последовательности

void input(int index); // ввод элемента с заданным индексом

void input_all(void); // ввод всех элементов сразу

private:

bool * __items;

const int __len;

};

Существует еще один способ обращения к компонентам объектов – через указатели на компоненты. Указатель на компонент класса – особый вид указателей, который можно «привязать» к компоненту класса с заданным форматом (прототипом). Значением такого указателя является «связь» с компонентом класса. Указатель на компонент можно определить согласно следующему обобщенному формату:

value_type (class_id::*pointer_id) initializer // для данных

value_type (class_id::*pointer_id) (parameters) initializer // для функций,

где value_type – тип компонента (для компонентной функции – тип возвращаемого значения); class_id – имя класса, pointer_id – имя указателя на компонент; initializer – инициализирующее выражение; parameters – список параметров компонентной функции. Формат инициализатора имеет вид

= &class_id::member_id,

где member_id – имя некоторого компонента класса, формат которого удовлетворяет определению указателя на компонент.

Обращение к компоненту объекта через указатель на компонент реализуется операциями .* и –>*. Обе эти операции бинарные и в качестве правого операнда ожидают указатель на компонент. Левым операндом у первой из них должна быть ссылка на объект класса, а у второй – указатель на объект класса. Форматы обращения через указатели на компоненты будут следующими:

object_id.*pointer_id // для данных

object_id.*pointer_id(arguments) // для функций.

Если имеется указатель на объект (pointer_to_object), то обратиться к компонентам объекта можно так:

pointer_to_object–>*pointer_id // для данных

pointer_to_object->*pointer_id(arguments) // для функций

(*pointer_to_object).*pointer_id // для данных

(*pointer_to_object).*pointer_id(arguments) // для функций.

Теперь рассмотрим пример использования указателей на компоненты. В примере воспользуемся уже определенным выше классом CBitSequence, моделирующим двоичные последовательности.

Пример

...

CBitSequence seq; // создание двоичной последовательности

CBitSequence * pseq = &seq; // указатель на объект

...