Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по прогр.ч.2.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
293.89 Кб
Скачать

Лекция 2

Объекты

Рассмотрим пример описания класса «библиографическая карточка”, включающего следующие поля:

имя автора;

название книги;

издательство;

год издания;

количество страниц

и следующие методы:

определение значений полей класса;

вывод на экран полей класса;

функции доступа к закрытым полям класса.

class card

{char * author;

char * title;

char * firm;

int year;

int pages;

public:

void set_author(char * a)

{author=a;}

void set_title(char * t)

{title=t;}

void set_firm(char * f)

{firm=f;}

void set_year(int y)

{year=y;}

void set_pages(int p)

{pages=p;}

//функции доступа к полям

char * get_author()

{return author;}

char * get_title()

{return title;}

char * get_firm()

{return firm;}

int get_year()

{return year;}

int get_pages()

{return pages;}

//вывод значений полей на экран

void output()

{cout<<”\n”<<”author=”<<author;

cout<<”\n”<<”title=”<<title;

cout<<”\n”<<”firm=”<<firm;

cout<<”\n”<<”year=”<<year;

cout<<”\n”<<”pages=”<<pages;

cout<<”\n”;

}//конец метода output()

};//конец класса

Переменная типа «класс» называется экземпляром класса или объектом.

Для описания объекта используется конструкция:

<имя класса><имя объекта>;

Например:

complex1 x1,x2,D; // три объекта класса complex1

complex1 *point=&D; // указатель на объект класса complex1

card dim[3];//массив из трех объектов класса card

При создании каждого объекта выделяется память, достаточная для хранения всех его полей.

Время жизни и видимости объектов зависит от вида и места их определения.

Различают глобальные, автоматические и динамические объекты

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

Автоматические объекты создаются, когда их объявление встречается в программе, и разрушаются при выходе из блока программы, в котором они объявлены.

Динамические объекты создаются в динамической памяти в процессе выполнения программы оператором new и разрушаются оператором delete.

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

Пример:

void main()

{complex a;//автоматический объект

complex 1*b;//указатель на объект

b=new complex1;

/* создать в ДП объект класса complex1 и адрес его запомнить в указателе b */

delete b;//уничтожить динамический объект

}

Объект а создается автоматически в начале программы и будет уничтожен, когда программа закончит свою работу. Объект b создается динамически, когда будет выполнен оператор new, и уничтожается оператором delete.

Рассмотрим способы доступа к элементам классов.

Для автоматических объектов доступ к данным извне осуществляется с

помощью конструкции:

<имя объекта>.<имя класса>::<имя поля>

Например:

a.complex1::real=5.0;

Часть конструкции <имя класса>:: можно опустить:

a.real=5.0;

Для обращения к методу автоматического объекта извне можно использовать конструкцию:

<имя объекта>.<обращение к методу>

Например:

a.define(4.0,20.0);//real=4.0, image=20.0

a.define();//real=0.0, image=0.0

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

Доступ к элементам динамических объектов предусматривает явное использование указателя на объект и операцию косвенного выбора элемента '->'.

Для обращения к полям данных динамического объекта извне следует использовать конструкцию:

<указатель на объект>-><имя поля>

Например:

complex1 *b;

b=new complex1;

b->real=2.3;

b->image=6.1;

Для обращения к методу динамического объекта следует использовать конструкцию:

<указатель на объект>-><обращение к методу>

Например:

b->display();

Пример.

Описать класс “анкета”, включающий:

имя

год рождения

функции инициализации полей

функции доступа к полям.

В главной функции предусмотреть создание объекта класса “анкета”

и вывод значений полей этого класса на экран.

#include<iostream.h>

#include<stdio.h>

class ank

{char *name;

int year;

public:

void set_name(char *str)

{name=str;}

void set_year(int g)

{year=g;}

char *get_name()

{return name;}

int get_year()

{return year;}

};

void main()

{char s[80];

int l;

gets(s);

cin>>l;

ank a;

a.set_name(s);

a.set_year(l);

cout<<"\n"<<a.get_name()<<" "<<a.get_year()<<"\n"; }

Замечание 1.

В одном и том же методе мы можем использовать переменные с одним именем, но принадлежащие разным областям видимости.

Например:

void complex1::define(double real, double image)

{complex1::real=real;

complex1::image=image;

}

Здесь абсолютно разные переменные имеют имя real. Одна является полем класса complex1, а другая передается в качестве параметра в метод класса.

Замечание 2.

Язык С++ допускает раздельную компиляцию частей программы. Можно определение класса разместить в одном файле, а главную функцию в другом файле, но при этом файл с классом подключить к главной функции с помощью директивы #include.