Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
red79;;;;;;;;;;;Лекция 8.
Классы.
Класс это определяемый пользователем тип, это абстрактный тип, он описывает модель реального физического объекта, которая представляет собой совокупность данных (характеристик объекта) и функций (описывающих поведение объекта).
Данные класса их еще называют полями (сравнить со структурой) это характеристики объекта.
Функции класса методы (функции члены класса ) описывают действия над данными, эти функции-члены предназначены для доступа к данным.
В простейшем случае описание класса выглядит так:
class имя
{private:
//элементы класса секция private Секций м.б. несколько,
. . . . . . . . . . . . . . . . порядок их не важен.
public:
//элементы класса секция public
. . . . . . . . . . . . . .
};
private и public это спецификаторы доступа, они управляют видимостью элементов класса. После private стоят элементы, видимые внутри класса. Этот вид доступа принят в классах по умолчанию. Доступ к этим элементам возможен только из функций, расположенных внутри класса, т.е. это возможность защиты этих элементов от доступа функций, расположенных вне класса.
В секции public описываются данные и функции, которые доступны вне класса (это интерфейс класса).
Итак, основополагающей идеей ООП является объединение данных и действий (функций), производимых над этими данными, в одном классе. Говорят : данные и методы инкапсулированы.
Рассмотрим простой пример:
class myclass
{ private:
int dan; // поля могут быть любого типа, кроме типа
char c; //этого класса, но м.б. указателями или ссылками
public: //на этот класс. Инициализация полей не допускается
void show(){cout<<dan<< <<c<<endl;}
int get_dan(){return dan;}
char get_c() {return c;}
};
Методы, определяемые подобным образом являются встраиваемыми. Можно функции внутри класса объявить, а реализацию определить вне класса, такая функция по умолчанию не является встраиваемой.
Определение объектов: Объект это переменная типа класс.
myclass a1,a2;
myclass x[10];
myclass *pw;
myclass *qw=new myclass(65,A);
myclass &t=a1;
Вызов метода класса применяется как вызов метода конкретного объекта, определяется синтаксисом для доступа к элементам структуры:
x[3]. show();
a1.show(); . операция доступа к члену класса через имя объекта, отобразит на экране значения полей этого объекта.
При обращении через указатель операцию -> можно выбрать:
cout<<qw->get_dan(); cout<<(*qw).get_dan();
Замечание. В некоторых языках ООП вызовы методов называют сообщениями (посылка сообщения объекту a1 с указанием вывести данные на экран).
Можно при описании класса определить функцию, которая будет задавать значения полей класса:
void set_dan (int d) {dan=d;}
void set_c (char ch) {c=ch;}
a1.set_dan (65); a1.set_c (A);
Однако лучше инициализировать объект в момент создания, а не вызовом функций. Специальные функции конструируют значение объекта в момент создания, выполняется эта функция автоматически, называется она конструктор.
Конструктор отличается от других методов класса:
а) имя конструктора совпадает с именем класса;
б)у конструктора нет типа возвращаемого значения (он вызывается автоматически и ему не надо возврашать кому-то результат работы).
Есть 3 вида конструкторов:
1
1)При создании объекта специальный конструктор инициализирует поля объекта нулями. Такой конструктор называется конструктор по умолчанию
Если в классе конструктор по умолчанию не объявлен, то компилятор создает его сам. Без него нельзя было бы определить переменные типа класс: myclass a1;
Если для класса объявлен другой конструктор с параметрами (конструктор инициализации), то компилятор не создает свой конструктор по умолчанию. Если он нужен, то его надо объявлять самим.
2
2) Если необходимо инициализировать какие-то поля конкретными значениями, то необходимо объявить конструктор для инициализации . Их может быть несколько.
myclass a (69,D);
3
3)третий способ инициализации объекта когда используется уже существующий объект, это конструктор копирования Он имеет единственный параметр ссылку на объект этого же класса:
myclass (myclass & x) - конструктор копирования. Он вызывается:
(1)при описании объекта с инициализацией другим объектом:
myclass a2 (a1); //a1 определен ранее.
myclass a2 =a1; // это инициализация, а не присваивание.
(2) при передаче объекта в функцию по значению.
(3) при возврате объекта из функции.
Если не указан конструктор копирования, то компилятор создает его по умолчанию. Копировщик просто копирует поля указанного в параметре объекта в поля нового объекта. Это поверхностное копирование, все поля из указанного в параметре объекта просто копируются в переменные члены нового объекта.
myclass b(a);
3