- •Министерство образования рф
- •Глава 2. Наследование, полиморфизм и виртуальные функции
- •1.2. Доступность компонентов класса
- •1.3. Конструктор и деструктор
- •1.4. Компоненты-данные и компоненты-функции
- •1.4.1. Данные - члены класса.
- •1.4.2.Функции - члены класса.
- •1.4.3.Константные компоненты-функции.
- •1.4.4. Статические члены класса
- •1.5.1.Указатели на компоненты- данные.
- •1.5.2.Указатели на компоненты- функции.
- •1.6. Указатель this
- •1.7. Друзья классов
- •7.1. Дружественная функция
- •1.7.2. Дружественный класс
- •1.8. Определение классов и методов классов.
- •1.9. Упражнения.
- •Глава 2. Наследование.
- •2.1. Определение производного класса.
- •2.2.Конструкторы и деструкторы производных классов
- •2.4.Абстрактные классы
- •2.5.Включение объектов.
- •2.6.Включение и наследование .
- •2.7. Множественное наследование
- •2.8. Локальные и вложенные классы
- •Глава 3. Перегрузка операций
- •3.1. Перегрузка унарных операций
- •3.2. Перегрузка бинарных операций
- •3.4. Перегрузка операции вызова функции
- •3.5. Перегрузка операции присваивания
- •3.6. Перегрузка операции new.
- •3.6.1.Синтаксис
- •3.6.2.Правила использования операции new.
- •3.6.3.Обработка ошибок операции new.
- •3.7. Перегрузка операции delete.
- •3.8. Основные правила перегрузки операций.
- •3.9. Упражнения
1.5.1.Указатели на компоненты- данные.
Можно определить указатель на компоненты-данные.
тип_данных(имя_класса : :*имя_указателя)
В определении указателя можно включить его инициализатор
&имя_класса : : имя_компонента
Пример. double(complex : :*pdat) = &complex : : re;
Естественно, что в этом случае данные-члены должны иметь статус открытых(pubic).
После инициализации указателя его можно использовать для доступа к данным объекта.
complex c(10.2,3.6);
c/*pdat=22.2; //изменилось значение поля re объекта c.
Указатель на компонент класса можно использовать в качестве фактического параметра при вызове функции.
Если определены указатели на объект и на компонент, то доступ к компоненту с помощью операции ‘ –>* ’.
указатель_на_объект –>*указатель_на_компонент
Пример 1.5.1.
double(complex : :*pdat) = &complex : : re;
complex C(10.2,3.6);
complex *pcom = &C;
p
com
–>*pdat = 22.2;
Можно определить тип указателя на компоненты-данные класса:
typedef double(complex::*PDAT);
void f(complex c, PDAT pdat) {c.*pdat=0;}
complex c;
PDAT pdat=&complex::re; f(c,pdat);
pdat=&complex::im; f(c,pdat);
1.5.2.Указатели на компоненты- функции.
Можно определить указатель на компоненты-функции.
тип_возвр_значения(имя_класса::*имя_указателя_на_функцию)(специф_параме-тров_функции);
Пример1.5.1.
// Определение указателя на функцию-член класса
double(complex : :*ptcom)();
// Настройка указателя
ptcom = &complex : : real;
// Теперь для объекта А
complex A(5.2,2.7);
// можно вызвать его функцию
cout<<(A.*ptcom)();
// Если метод real определить типа ссылки
double& real(void){return re;}
// то используя этот метод можно изменить поле re
(A.*ptcom)() = 7.9;
// При этом указатель определяется так
double&(complex : :*ptcom)();
Можно определить также тип указателя на функцию
typedef double&(complex::*PF)();
а затем определить и сам указатель
PF ptcom=&complex::real;
1.6. Указатель this
Когда функция-член класса вызывается для обработки данных конкретного объекта, этой функции автоматически и неявно передается указатель на тот объект, для которого функция вызвана. Этот указатель имеет имя thisи неявно определен в каждой функции класса следующим образом
имя_класса *const this = адрес_объекта
Указатель this является дополнительным скрытым параметром каждой нестатической компонентной функции. При входе в тело принадлежащей классу функции this инициализируется значением адреса того объекта, для которого вызвана функция. В результате этого объект становится доступным внутри этой функции.
В большинстве случаев использование this является неявным. В частности, каждое обращение к нестатической функции-члену класса неявно использует this для доступа к члену соответствующего объекта. Например, функцию add в классе complex можно определить эквивалентным, хотя и более пространным способом:
void complex add(complex ob)
{this->re=this->re+ob.re;
// или *this.re=*this.re+ob.re
this->im=this->im+ob.im;}
Если функция возвращает объект, который ее вызвал, используется указатель this.
Например, пусть функция add возвращает ссылку на объект. Тогда
complex& complex add(complex& ob)
{re=re+ob.re;
im=im+ob.im;
return *this;
}
Примером широко распространенного использования this являются операции со связанными списками.
Пример.1.6.1.Связанный список.
#include <iostream.h>
//Определение класса
class item
{
static item *begin;
item *next;
char symbol;
public:
item (char ch){symbol = ch;} // конструктор
void add(void); // добавить в начало
static void print(void);
};
//Реализация класса
void item : : add(void)
{
this –>next = begin;
begin = this;
}
void item : : print(void)
{
item *p;
p = begin;
while(p != NULL )
{
cout<<p –>symbol<<“ \t ”;
p = p –>next;
}
}
//Создание и просмотр списка
item *item : : begin = NULL; // инициализация статического компонента
void main()
{
item A(‘a’); item B(‘b’); item C(‘c’);
// включение объектов в список
A.add(); B.add(); C.add();
// просмотр списка в обратном порядке
item : : print();
}
