Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Владимирский государственный университет
Имени Александра Григорьевича и Николая Григорьевича Столетовых»
(ВлГУ)
Лабораторная работа №1
По дисциплине «объектно-ориентированное программирование»
«Работа с классами»
Выполнил:
ст. гр. АИСс-112
Сёмин Максим Александрович
Проверил:
ст. преподаватель каф. ФиПМ
Шишкина М.В.
Владимир, 2013
Постановка задачи
Создать класс Complex для работы с комплексными числами, который должен содержать два целочисленных скрытых (приватных) поля Re, lm. Конструктор по умолчанию и конструктор инициализации. Методы для чтения и записи, соответствующих полей, один из которых будет запрашивать у пользователя значения полей на ввод с клавиатуры, а другой выводить значения полей на экран
Создать два экземпляра класса
Для первого вызвать конструктор по умолчанию, для второго конструктор инициализации.
Вывести значение полей на экран, сопровождая их пояснительными надписями.
С помощью соответствующих методов изменить значения полей и снова вывести их на экран.
С помощью конструктора копирования скопировать значения полей одного объекта в другой объект и снова вывести их на экран
Создать две дружественные функции унарную и бинарную, перегрузить бинарные и унарные операции (поств и префиксн)
Теоретическая часть
1) Структура, синтаксис, классы, примеры.
Классы в С++ - это абстракция описывающая методы, свойства, ещё не существующих объектов. Объекты - конкретное представление абстракции, имеющее свои свойства и методы. Созданные объекты на основе одного класса называются экземплярами этого класса. Эти объекты могут иметь различное поведение, свойства, но все равно будут являться объектами одного класса. В ООП существует три основных принципа построения классов:
|
Инкапсуляция - это свойство, позволяющее объединить в классе и данные, и методы, работающие с ними и скрыть детали реализации от пользователя.
Наследование - это свойство, позволяющее создать новый класс-потомок на основе уже существующего, при этом все характеристики класса родителя присваиваются классу-потомку.
Полиморфизм - свойство классов, позволяющее использовать объекты классов с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Структуру объявления классов:
// объявление классов в С++
class /*имя класса*/
{
private:
/* список свойств и методов для использования внутри класса */
public:
/* список методов доступных другим функциям и объектам программы */
/*Спецификатор public позволяет переменным/объектам созданным на основе данной структуры/класса получить доступ к полям. */
protected:
/*список средств, доступных при наследовании*/
};
Конструктор - специальная функция, которая выполняет начальную инициализацию элементов данных, причём имя конструктора обязательно должно совпадать с именем класса. Важным отличием конструктора от остальных функций является то, что он не возвращает значений вообще никаких, в том числе и void. В любом классе должен быть конструктор, даже если явным образом конструктор не объявлен, то компилятор предоставляет конструктор по умолчанию, без параметров.
|
Деструктор - это специальные методы, которые разрушают объекты и освобождают занимаемую ими память. Объявление деструктора подобно объявлению процедуры, но вместо слова процедура указывается destructor
Методы - это функция, объявленная внутри определения класса и тесно связанная с типом этого класса.
Оператор в С++ - это некоторое действие или функция обозначенная специальным символом.
Структура – это составной объект, в который входят элементы любых типов, за исключением функций. В отличие от массива, все элементы которого однотипны, структура может содержать элементы разных типов. В языке C++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры так, как они определены в языке Си:
struct [ имя_типа ]
{
тип_1 элемент_1;
тип_2 элемент_2;
...
тип_n элемент_n;
} [ список_описателей ];
Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка.
Пример:
struct {
int year;
char moth;
int day;
} date, date2;
Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами.
Пример:
struct student{ // описание нового типа student
char fio[30];
long int num_zac;
double sr_bal;
}; // описание заканчивается точкой с запятой
|
student gr[30], *p; // определение массива типа student и
//указателя на тип student.
Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:
Пример:
struct {
char fio[30];
long int num_zac;
double sr_bal;
}student1 = {"Necto", 011999,3.66};
· Способы доступа и обращения к полям.
Доступ к полям структуры выполняется с помощью операций выбора. (точка) при обращении к полю через имя структуры и операции –> при обращении через указатель.
Пример:
student student1, gr[30], *p;
student.fio = "Страусенке":
gr[8].sr_bal=5;
p–>num_zac = 012001;
Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора.
Пример:
struct A {
int a;
double х;
};
struct В {
A a;
double х,
} х[2];
х[0].а.а = 1;
х[1]. х = 0.1;
Из примера видно, поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости. Более того, можно объявлять в одной области видимости структуру и другой объект (например, переменную или массив) с одинаковыми именами, если при определении структурной переменной использовать слово struct.
· Массив структур.
Статические массивы в структурах
Полем структуры может быть одномерный или двумерный массивы
фиксированной размерности. Например,
struct Matr
{ int a[2][3];
float b[3];
char fio[20];
};
.....
Matr Str;
Str.a[0][0]=25;
cout<<Str.a[i][j];
cin>>Str.b[2];
Str.fio[0]='*';
Сначала необходимо определить структурный тип, а затем объявить
массив переменных данного типа.
Например,
struct Date
{ char Fam[20];
char Name[10];
long TelephoneNumber;
};
struct date
{ int day, month, year;
};
struct person
{ char fam[20];
date birthday;
float weight;
int height;
};
Date list[10];
const n=100;
person P1[n];
Matr matr[n];
.....
cin>>list[1].Fam;
cout<<P1[i]. birthday.day;
matr[0].a[0][1]=25;