Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы ПП all-in-one.docx
Скачиваний:
10
Добавлен:
14.11.2019
Размер:
2.64 Mб
Скачать

2.6. Метки класса

В теле класса А используются ключевые слова (метки) private

(личный) и public (общий). Кроме них может быть еще protected

(защищенный). Эти метки определяют способ доступа к членам класса. После меток ставится (:).

private - означает, что все члены этого раздела доступны только функциям этого класса.

public - означает, что все следующие за этой меткой члены являются общими, т.е. открытыми для доступа из любой точки программы в области видимости объекта класса.

protected - следующие за этой меткой члены класса доступны так же, как члены типа private, но могут наследоваться и быть доступными в любом классе, порожденном из данного класса.

Если ключевые слова опущены, то подразумевается доступ private.

Обычно функции класса относятся к членам типа public, а данные - к типу private. Таким образом, организуется защита данных.

2.7. Создание объекта класса в динамической памяти

Обращение к членам из части private возможен только из функций класса. Это означает, что в предыдущем примере нельзя обратиться к переменным a и b через операцию (.), т.е. cout<< a1. а;

приведет к ошибке.

Доступ к членам public осуществляется с помощью операций (.) и (->). Операции (->) используется, если определен указатель на объект класса и объект класса создан в динамической памяти.

Для этого нужно создать указатель на объект класса

A *a1;

а затем создать сам объект операцией new:

a1=new A;

Тогда вызов функции input() класса А будет таким:

a1->input();

ЗАПОМНИТЕ, что указатели должны получить начальные значения, что при создании указателя на объект класса выделяется только 4 байта, а сам объект не создается. Поэтому написать вызов функции класса с помощью указателя, которому не присвоено определенное значение - это грубейшая ошибка.

Изменим предыдущий пример так, чтобы объект класса А задавался указателем:

Запустите проект на выполнение и убедитесь, что он работает правильно.

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

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

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

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

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

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

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

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

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

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

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

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

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)();