
Лекция 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.