Указатели на компоненты-функции

 

Можно определить указатель на компоненты-функции.

тип_возвр_значения(имя_класса::*имя_указателя_на_функцию) (специф_параметров_функции);

Пример.

double(complex : :*ptcom)(); // Определение указателя

ptcom = &complex : : real; // Настройка указателя

// Теперь для объекта А можно вызвать его функцию

complex A(5.2,2.7);

cout<<(A.*ptcom)();

 

Порядок выполнения работы.

 

4. 1Определить пользовательский класс в соответствии с вариантом задания (смотри приложение).

5. Определить в классе следующие конструкторы: без параметров, с параметрами, копирования.

6. Определить в классе деструктор.

7. Определить в классе компоненты-функции для просмотра и установки полей данных.

8. Определить указатель на компоненту-функцию.

9. Определить указатель на экземпляр класса.

10. Написать демонстрационную программу, в которой создаются и разрушаются объекты пользовательского класса и каждый вызов конструктора и деструктора сопровождается выдачей соответствующего сообщения (какой объект какой конструктор или деструктор вызвал).

11. Показать в программе использование указателя на объект и указателя на компоненту-функцию.

Методические указания.

 

Пример определения класса.

const int LNAME=25;

class STUDENT{

char name[LNAME]; // имя

int age; // возраст

float grade; // рейтинг

public:

STUDENT(); // конструктор без параметров

STUDENT(char*,int,float); // конструктор с параметрами

STUDENT(const STUDENT&); // конструктор копирования

~STUDENT();

char * GetName() ;

int GetAge() const;

float GetGrade() const;

void SetName(char*);

void SetAge(int);

void SetGrade(float);

void Set(char*,int,float);

void Show(); };

Более профессионально определение поля name типа указатель: char* name. Однако в этом случае реализация компонентов-функций усложняется.

2. Пример реализации конструктора с выдачей сообщения.

STUDENT::STUDENT(char*NAME,int AGE,float GRADE)

{

strcpy(name,NAME); age=AGE; grade=GRADE;

cout<< \nКонструктор с параметрами вызван для объекта <<this<<endl;

}

 

3. Следует предусмотреть в программе все возможные способы вызова конструктора копирования. Напоминаем, что конструктор копирования вызывается:

а) при использовании объекта для инициализации другого объекта

Пример.

STUDENT a(“Иванов”,19,50), b=a;

б) когда объект передается функции по значению

Пример.

void View(STUDENT a){a.Show;}

в) при построении временного объекта как возвращаемого значения функции

Пример.

STUDENT NoName(STUDENT & student)

{STUDENT temp(student);

temp.SetName(“NoName”);

return temp;}

 

STUDENT c=NoName(a);

4. В программе необходимо предусмотреть размещение объектов как в статической, так и в динамической памяти, а также создание массивов объектов.

Пример.

а) массив студентов размещается в статической памяти

STUDENT gruppa[3];

gruppa[0].Set(“Иванов”,19,50);

и т.д.

или

STUDENT gruppa[3]={STUDENT(“Иванов”,19,50),

STUDENT(“Петрова”,18,25.5),

STUDENT(“Сидоров”,18,45.5)};

б) массив студентов размещается в динамической памяти

STUDENT *p;

p=new STUDENT [3];

p-> Set(“Иванов”,19,50);

и т.д.

5. Пример использования указателя на компонентную функцию

void (STUDENT::*pf)();

pf=&STUDENT::Show;

(p[1].*pf)();

 

Содержание отчета.

 

1. Титульный лист: название дисциплины; номер и наименование работы; фамилия, имя, отчество студента; дата выполнения.

2. Постановка задачи. Следует дать конкретную постановку, т.е. указать, какой класс должен быть реализован, какие должны быть в нем конструкторы, компоненты-функции и т.д.

3. Определение пользовательского класса с комментариями.

4. Реализация конструкторов и деструктора.

5. Фрагмент программы, показывающий использование указателя на объект и указателя на функцию с объяснением.

6. Листинг основной программы, в котором должно быть указано, в каком месте и какой конструктор или деструктор вызываются.

Контрольные вопросы

 

1. Понятия class и struct?

2. Параметры видимости компонент в определении класса.

3. Что такое инкапсуляция?

4. Что такое конструктор, зачем он нужен, когда вызывается?

5. Что такое деструктор, зачем он нужен, когда вызывается?

6. В чем особенность и когда нужен конструктор копирования?

7. Операции new и delete.

8. This, его назначение и применение.

9. Inline функции;

10. Особенности работы с массивами классов.

Варианты

Описания членов - данных пользовательских классов

 

Вариант 1.

АВТОМОБИЛЬ

марка – char*

модель – char*

производитель – char*

мощность – int

стоимость – float

 

Вариант 2.

КАТАЛОГ ЭВМ

тип процессора – char*

тактовая частота – float

объем оп. памяти – int

емкость винчестера – float

 

Вариант 3.

ШКОЛА

название-char*

тип -char*

адрес - char*

количество учеников –int

количество учителей –int

 

Вариант 4.

САМОЛЕТ

марка – char*

модель – char*

производитель – char*

тип – char*

дальность полета – float

 

Вариант 5.

ТЕЛЕФОН

модель – char*

производитель – char*

стандарт – char*

стоимость – float

 

Вариант 6.

СТУДЕНТ

фамилия – char*

имя – char*

отчество– char*

курс – int

группа– char*

 

Вариант 7.

РАБОТНИК

фамилия – char*

имя – char*

отчество– char*

возраст – int

рабочий стаж – int

 

Вариант 8.

ИЗДЕЛИЕ

наименование – char*

шифр – char*

тип упаковки– char*

количество – int

 

Вариант 9.

КАДРЫ

фамилия – char*

имя – char*

отчество– char*

номер цеха – int

разряд – int

 

Вариант 10.

АДРЕС

страна – char*

город– char*

улица – char*

номер дома – int

 

Вариант 11.

КОРАБЛЬ

имя – char*

водоизмещение – int

численность команды -int

тип – char*

 

Вариант 12.

ЦЕХ

название – char*

фамилия начальника – char*

количество

работающих – int

 

Вариант 13.

КАТАЛОГ ПРИНТЕРОВ

производитель – char*

тип – char*

объем оп. памяти – int

скорость печати – float

 

Вариант 14.

СТРАНА

название – char*

форма

правления – char*

площадь – float

население – float

 

Вариант 15.

РАСТЕНИЕ

название– char*

класс – char*

среднее время жизни – int

место произрастания – char*

 

Вариант 16.

КНИЖНЫЙ МАГАЗИН

название – char*

тематика – char*

автор – char*

стоимость – float

 

Вариант 17.

ТОВАР

наименование – char*

единицы измерения – char*

количество – float

цена-float

стоимость – float

 

Вариант 18.

ПЕРСОНА

фамилия – char*

имя – char*

отчество– char*

возраст – int

пол – int(bool)

 

 

Вариант 19.

ЖИВОТНОЕ

название – char*

класс – char*

средний вес – int

страна обитания –char*

 

Вариант 20.

ЭКЗАМЕН

имя студента – char*

группа – char*

дата – int

оценка – int


Лабораторная работа № 12

 

«ПЕРЕГРУЗКА ОПЕРАЦИЙ И ФУНКЦИЙ В С++»

 

Цель. Получить практические навыки реализации перегрузки операций и функций на С++.