Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛаборООП.docx
Скачиваний:
49
Добавлен:
01.06.2015
Размер:
1.46 Mб
Скачать

Оглавление

Лабораторная работа 1. Классы и объекты в С++ 1

Цель работы 1

Основные сведения 1

Основные сведения 1

Варианты задания 6

Контрольные вопросы 9

Лабораторная работа 2. Наследование в С++. Виртуальные функции 10

Цель работы 10

Основные сведения 10

Варианты задания 16

Контрольные вопросы 18

Лабораторная работа 3. Виртуальные функции. Выбор типа объектов 19

Цель работы. 19

Основные сведения 19

Варианты задания 22

Контрольные вопросы 23

Лабораторная работа 4. Контейнеры STL. Обработка исключений 25

Цель работы. 25

Основные сведения 25

Варианты задания 30

Контрольные вопросы 32

Лабораторная работа 5. Классы, объекты, наследование в С# 34

Цель работы 34

Основные сведения 34

Контрольные вопросы 37

Требования к отчету 37

Литература 39

Приложения 41

1.Создание консольного приложения в Visial Studio .Net 41

2. Cоздание графического интерфейса к программам на С++ в Visual Studio . Net 44

Всего предусмотрено выполнение 5 лабораторных работ. Первые 3 работы сдаются в 1-м модуле. При несвоевременной сдаче лабораторных работ оценка снижается.

Требования к отчету см. ниже.

Первые 4 работы могут быть выполнены на С++ как консольные приложения Visual Studio-Win32 / Builder C++/Qt . Последняя - на С# в Visual Studio . Создание программ с графическим интерфейсом не возбраняется (см. Приложения).

Лабораторная работа 1. Классы и объекты в С++

Цель работы

Ознакомление с технологией построения классов, разработкой методов, дружественных функций и перегрузкой операций.

Основные сведения Основные сведения

Базовыми понятиями объектно-ориентированной программы явля­ются «объект класса» и «класс». Эти понятия аналогичны понятиям переменной и её типа. Членами класса явля­ются переменные базовых типов языка, объекты классов, объявленных в программе (последние называют пользовательскими типами), и функции, работающие с этими переменными. Обычно переменные, определенные в классе, называют полями или данными, а функции – методами класса. Говорят, что значения полей объекта класса определяют его состояние, а методы класса - поведение. В С++ имеется возможность управлять доступом к полям и методам класса, в частности, установление такого порядка, при котором доступ к полям класса имеют только его методы. Объединение данных и методов работы с ними в одну языковую конструкцию с возможностью управления доступом к данным называется инкапсуляцией.

Тип класса может быть задан одним из 3-х атрибутов: class, struct, union. Имя класса становится идентификатоpом нового типа данных. Определение класса выглядит следующим образом:

class Alpha { // Начало определения

// Поля класса

int x;

double y;

//Конструктор

Alpha (){x=0; y=0;}

//Метод

Alpha setAlpha( int _x, int _y){x=_x; y=_y;}

//Деструктор

~Alpha(){};

}; //Конец определения класса

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

Объект класса может быть создан в памяти, управляемой компилятором,

Alpha a1;

а также в динамической памяти с помощью функцииnew.

Alpha *a2=new Alpha;

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

Деструктор класса автоматически разрушает объект при выходе последнего из области видимости; деструктор имеет имя класса, которому предшествует символ ~. Деструктор не имеет параметров и не возвращает значе­ния; в классе может быть только один деструктор. Если при создании объекта в конструкторе используется опера­ция new, то в деструкторе должен быть использован операция delete.

Конструктор класса X, создаваемого пользователем, может иметь параметры любого типа, кроме X; допускается параметр типа X& (ссылка на объект типа X). Конструктор с параметром-ссылкой называется конструктором копирования; он подразумевает создание нового объекта и копирование в него ранее созданного.

Если пользователь не определяет в классе X ни конструктора, ни деструктора, то компилятор автоматически создает конструктор с пустыми телом и пустым списком параметров, конструктор копирования, деструктор с пустым телом и определяет операцию почленного копирования объектов этого класса. Определение пользователем в классе собственного конструктора, деструктора, конструктора или операции копирования отменяет автоматическое создание соответствующих членов класса.

Объявление объекта класса должно соответствовать имеющемуся конструктору. Спо­собы создания объектов те же, что и в языке С: объект может объявляться как простая перемен­ная, массив, указатель. Для создания массива объектов следует иметь в классе конструктор без параметров или конструктор, у которого все параметры заданы по умолчанию.

Локальные нестатические поля класса не могут инициализироваться при их объявлении в классе. Инициализация таких полей возможна только при создании объекта с помощью соот­ветствующего конструктора.

Доступ к члену класса определяется наличием в определении класса атри­бутов доступа public, private, protected. Атрибут public определяет все следующие за ним члены класса как открытые, к которым разрешен прямой доступ из любой точки про­граммы; private запрещает прямой доступ к соответствующим компонентам извне (закрытые компоненты). В классе типа class все компоненты по умолчанию private, в классах типа struct – public. Каждый атрибут, записанный в классе, отменяет действие предыду­щего. (Атрибут protected(защищенный) – используется в иерархии классов).

Принятый способ использования атрибутов: данные объявляются типа private (protected в базовых классах), методы, конструкторы и деструктор – типа public.

Созданный объект имеет доступ ко всем не закрытым полям и методам класса. Обращение к этим членам может двояким:

имя_объекта.имя_члена или указатель_на_объект->имя_члена.

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

Кроме методов доступ к закрытым членам класса имеют так называемые дружествен­ные функции. Они не являются членами класса, хотя и записываются в его теле, и объявляются в следующем виде:

friend тип имя (параметры);

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

– при необходимости упростить форму обращения к компонентам класса: не будучи компо­нентом класса, дружественная функция при вызове не требует имени объекта;

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

Агрегация

Два класса могут быть связаны отношением агрегации(включения). Отношение агрегации (целое/часть, part of) между классами имеет место, когда один класс(целое) содержит в качестве компоненты объект или указатель на другой класс(часть). Например, один пользовательский класс содержит объект, тип которого определяется другим пользовательским классом. Различают строгую и нестрогую агрегацию. В первом случае часть включается в целое как значение, во втором – в виде указателя. (Строгая агрегация еще называется композицией). На диаграммах агрегация изображается сплошной линией от класса, объект которого является частью, до класса, в который включается этот объект; линия заканчивается пустым ромбом в случае нестрогой агрегации и зачерненным в противном случае).

Например,

class Point{

public:

double x, y;

/*…..*/

};

class Triangle {

public:

Point x1, x2, x3;

/*…..*/

};

Далее

void main()

{ Triangle t1;

t1.x1.x=5;

t1.x2.y=7;

……}

Закроем поля в Triangle и введем в него открытый метод:

class Triangle {

Point x1, x2, x3;

public:

void SetTriangle(double _x1, double _y1,double _x2,double _y2,double _x3,double _y3)

{x1.x=_x1;x1.y=_y1;x2.x=_x2;x2.y=_y2;x3.x=_x3;x3.y=_y3;}

};

void main(int argc, _TCHAR* argv[])

{

Triangle t1;

t1.SetTriangle(1,2,3,4,5,6);

}

Графическое изображение класса включает имя класса, его поля и методы. На диаграмме закрытому компоненту предшествует символ -, открытому – символ +.

Complex

- real : double (ДействительнаяЧасть)

- imag: double (МнимаяЧасть)

+Complex (void):Конструктор

+Complex(double,double):Конструктор с параметрами

+Complex(Complex&): Конструктор копирования

+~Complex (void):Деструктор

+setComplex: void (ВводЧисла )

+showComlex: void (ВыводЧисла )

+operator +:Complex (Сложение чисел)

+operator *: Complex (УмножениеЧисел )

+getComplex(Complex) (Вывод числа)

Ниже приведена программа реализация класса Complex в консольном проекте на Visual Studio. Проект включает 3 файла: заголовочный - Complex.h , реализации - Complex.cpp и функции main - MyComplex.cpp. В main приведены примеры создания объектов с помощью различных конструкторов, перегрузка операций и дружественная функция.

Листинг 1.1

//complex.h

#pragma once

class Complex

{ //Поля

double real;

double imag;

public:

//Конструкторы

Complex(); //Пустой

Complex(double, double);//С параметрами

Complex(Complex&); //Копирования

// Методы

void setComplex(); // Ввод числа

void showComplex () const; //Вывод на консоль

Complex operator + (Complex); //Перегрузка операции сложения

Complex operator * (Complex ); //Перегрузка операции умножения

//Дружественная функция вывода на консоль

friend void getComplex(Complex);

//Деструктор

~Complex(void);

};

//сomplex.cpp

#include "stdafx.h"

#include "Complex.h"

#include <iostream>

using namespace std;

Complex::Complex(void){ }

Complex::Complex(Complex& c1){ this->real=c1.real; this->imag=c1.imag;}

Complex::Complex(double _r, double _im){ this->real=_r; this->imag=_im;}

Complex::~Complex(void) { }

//Ввод числа

void Complex::setComplex() {

double re,im;

cout<<"Действительная часть ? "; cin>>re;

cout<<"Мнимая часть ? "; cin>>im;

real=re;

imag=im;

}

//Вывод числа

void Complex::showComplex()const{

cout<<this->real<<" +i"<<this->imag<<endl;

}

//Перегруженные операции +, *

Complex Complex:: operator + (Complex t)

{ Complex tmp;

tmp.real= this->real+t.real;

tmp.imag= this->imag+t.imag;

return tmp;

}

Complex Complex::operator *(Complex t){

Complex tmp;

tmp.real= this->real*t.real - this->imag*t.imag;

tmp.imag= this->imag*t.real + this->real*t.imag;

return tmp;

}

void getComplex(Complex c1)

{ cout<<c1.real<<" +i"<<c1.imag<<endl;}

//MyComplex.cpp

#include “stdafx.h”

#include "Complex.h"

#include <locale.h> // подключает setlocale

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

setlocale(LC_ALL,"Russian");//Русификация текста

Complex cm1, cm2, cm3;

cout<<"1-е число "<<endl;

cm1.setComplex();

cout<<"2-е число "<<endl;

cm2.setComplex();

cout<<"Сумма "<<endl;

cm3=cm1+cm2;

cm3.showComplex();

cout<<"Произведение "<<endl;

cm3=cm1*cm2;

cm3.showComplex();

Complex cm4(34.7, 21.8);

cout<<"Массив из 2-х чисел"<<endl;

Complex cm5[2];

for (int i=0; i<2; i++)

cm5[i].setComplex();

cout<<"Объект-указатель"<<endl;

Complex *cm6=new Complex(3,8);

cm6->showComplex();

cout<<"Объект-копия 1-го "<<endl;

Complex cm7(cm1);

getComplex(cm7);

delete cm6;

return 0;

}

Замечания

1. this, используемый в листинге, называется скрытым указателем на объект. Он создается автоматически вместе с объектом и не требует объявления. Употребление его в данном случае необязательно.

2. В библиотеке С++ есть класс complex, предназначенный для работы с комплексными числами. Это класс–шаблон, об особенностях работы с которыми говорится в работе №4.