Работа по С++ (1021520), страница 2
Текст из файла (страница 2)
Контрольные вопросы
-
В чем заключается особенность динамических массивов?
-
Какие вы знаете операции динамического выделения и освобождения памяти в С++?
-
Как объявить динамический многомерный массив, используя указатели?
-
Что содержит указатель на массив?
Работа № 2.
Классы. Программирование линейных алгоритмов с использованием функций инициализации set() и вывода результатов print()
Теоретические сведения
Задание к работе
Варианты заданий
Контрольные вопросы
Цель работы – изучить основные способы работы с пользовательским типом данных «класс», его объектами, методами и способы доступа к ним.
Теоретические сведения
Основное отличие С++ от С состоит в том, что в С++ имеются классы. С точки зрения языка С классы в С++ - это структуры, в которых вместе с данными определяются функции. Это и есть инкапсуляция в терминах ООП.
Класс (class) - это тип, определяемый пользователем, включающий в себя данные и функции, называемые методами или функциями-членами класса.
Данные класса - это то, что класс знает.
Функции-члены (методы) класса - это то, что класс делает.
Таким образом, определение типа задаваемого пользователем (class) содержит спецификацию данных, требующихся для представления объекта этого типа, и набор операций (функций) для работы с подобными объектами.
Объявление класса
Приведем пример объявления класса
class my_Fun
{
// компоненты-данные
double x,y;
// компоненты-функции
public:
// функция инициализации
void set(char *c,double X)
{
x=X;
y=sin(x);
}
// функция вывода результатов
void print(void)
{
cout << point<<y << endl;
}
};
Обычно описания классов включают в заголовочные файлы (*.H), а реализацию функций-членов классов - в файлы *.CPP.
Для каждого объекта класса устанавливается область видимости либо явно – указанием уровня доступа одним из ключевых слов public, private, protected с двоеточием, либо неявно – по умолчанию. Указание области видимости относится ко всем последующим объектам класса, пока не встретится указание другой области видимости. Область видимости public разрешает доступ к объектам класса из любой части программы, в которой известен этот объект (общедоступный). Область видимости private разрешает доступ к объектам класса только из методов этого класса. Объекты с такой областью видимости называют частными. Область видимости protected определяется для защищенных объектов, она имеет смысл только в иерархической системе классов и разрешает доступ к объектам этой области из методов производных классов. В теле класса ключевое слово области видимости может использоваться неоднократно. Область видимости для объектов типа «класс» по умолчанию private.
Способы объявления и инициализации объектов и доступ к методам класса:
1. Прямой вызов
my_Fun Fun1; //объявление объекта1,но не инициализация
Fun1.set("Function1 = ",1.0); // инициализация данных
Fun1.print(); // прямой вызов
cout << "Input enter1..." << endl<<endl;
2. Косвенный вызов
my_Fun *p1 = &Fun1; // воспользовались объектом 1
// новая инициализация
p1->set("Function1 = ",1.0); // косвенный вызов
p1->print(); // косвенный вызов
cout << "Input enter1..." << endl<<endl;
3. Динамическое выделение памяти
my_Fun *p1 = new my_Fun;
p1->set("Function1 = ",1.0); // косвенный вызов
p1->print(); // косвенный вызов
cout << "Input enter1..." << endl<<endl;
// удаляется динамически выделенный объект
delete p1;
Задание к работе
Пользовательский класс должен содержать необходимые элементы-данные, метод установки их начальных значений:
Void set(double X, …);
метод печати:
Void print(void);
метод, решающий поставленную задачу:
Void Run(void);
Код методов – вне пространства определения класса. Программа должна включать в себя статический и динамический способы создания объектов, и для каждого объекта использовать прямую и косвенную адресацию при вызове методов класса.
Варианты заданий
-
При x=14.26, y=-1.22, z=3.5t=0.564849.
-
При x=-4.5, y=0.75,z=0.845
u=-55.6848.
-
При x=3.74, y=-0.825, z=0.16
, v=1.0553.
-
При x=0.4,y=-0.875, z=-0.475
w=1.9873.
-
При x=-15.246, y=4.642, z=20.001
=-182.036.
-
При x=16.55, y=-2.75, z=0.15
=-40.630.
-
При x=0.1722, y=6.33, z=3.25=-205.305.
-
При x=-2.235, y=2.23, z=15.221
=39.374.
-
При x=1.825, y=18.225, z=-3.298
=1.2131.
-
При x=6.251, y=0.827, z=25.001 b=0.7121. -
При x=3.251, y=0.325, z=0.466c=4.25.
-
.
При x=17.421, y=10.365, z=0.828
f=0.33056.
-
.
При x=12.3, y=15.4, z=0.252
g=82.8257.
-
.
При x=2.444, y=0.869, z=-0.13
-0.49871.
Контрольные вопросы
-
Что значит в ООП понятие «класс», и какой формат его объявления в программе?
-
Что такое объект класса, что он содержит?
-
Какие существуют уровни доступа к объектам и методам класса (дать характеристику каждому)?
-
Что такое операция привязки, ее основное назначение?
Работа № 3.
Классы. Программирование линейных алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов print()
Теоретические сведения
Задание к работе
Варианты заданий
Контрольные вопросы
Цель работы – изучить основные способы работы по созданию конструктора класса с захватом динамической памяти и деструктора для ее освобождения, применение friend – функции, и изучение ее особенностей.
Теоретические сведения
Конструктор класса
Конструктор – это метод класса, имя которого совпадает с именем класса. Конструктор вызывается автоматически после выделения памяти для переменной и обеспечивает инициализацию компонент – данных. Конструктор не имеет никакого типа (даже типа void) и не возвращает никакого значения в результате своей работы. Конструктор нельзя вызывать как обычную компонентную функцию в программе. Для класса может быть объявлено несколько конструкторов, различающихся числом и типами параметров. При этом даже если для объектного типа не определено ни одного конструктора, компилятор создает для него конструктор по умолчанию, не использующий параметров, а также конструктор копирования, необходимый в том случае, если переменная объектного типа передается в конструктор как аргумент. В этом случае создаваемый объект будет точной копией аргумента конструктора.
class my_Fun
{
// компоненты-данные
double x;
unsigned size;
public:
// объявление конструктора 1 (с параметрами)
my_Fun (double X=0);
// объявление конструктора 2 (без параметров)
my_Fun(void);
// объявление и описание деструктора
~my_Fun ()
{
cout<<"Destroyed object... "<<endl;
}
// описание конструктора 1
my_Fun::my_Fun (double X)
{
cout<<"Constructor1...."<<endl;
x=X;
}
// описание конструктора 2
my_Fun::my_Fun (void)
{
cout<<"Constructor2..."<<endl;
x=5.0;
}
}
Деструкторкласса
Еще одним специальным методом класса является деструктор. Деструктор вызывается перед освобождением памяти, занимаемой объектной переменной, и предназначен для выполнения дополнительных действий, связанных с уничтожением объектной переменной, например, для освобождения динамической памяти, закрытия, уничтожения файлов и т.п. Деструктор всегда имеет то же имя, что и имя класса, но перед именем записывается знак ~ (тильда). Деструктор не имеет параметров и подобно конструктору не возвращает никакого значения. Таким образом, деструктор не может быть перегружен и должен существовать в классе в единственном экземпляре. Деструктор вызывается автоматически при уничтожении объекта. Таким образом, для статически определенных объектов деструктор вызывается, когда заканчивается блок программы, в котором определен объект (блок в данном случае – составной оператор или тело функции). Для объектов, память для которых выделена динамически, деструктор вызывается при уничтожении объекта операцией delete.
Дружественная функция(friend)
В языке С++ одна и та же функция не может быть компонентом двух разных классов. Чтобы предоставить функции возможность выполнения действий над различными классами можно определить обычную функцию языка С++ и предоставить ей право доступа к элементам класса типа private, protected. Для этого нужно в описании класса поместить заголовок функции, перед которым поставить ключевое слово friend. Дружественная функция не является методом класса, не зависит от позиции в классе и спецификаторов прав доступа. Friend – функции получают доступ к членам класса через указатель, передаваемый им явно. Можно сделать все функции класса Y друзьями класса X в одном объявлении.
Задание к работе
Общая постановка. Пользовательский класс Х должен содержать необходимые элементы-данные, которые создаются в динамической области памяти.
-
Конструктор для их создания (операция new) и установки их начальных значений: Х();
-
деструктор: ~Х();
-
friend – функция печати: friend void print();
-
функция, решающая поставленную задачу: friend Void Run().
Код методов и функций – вне пространства определения класса.
Варианты заданий
Варианты заданий используются из лабораторной работы №2.