3 (Семинары и упражнения)
Описание файла
Файл "3" внутри архива находится в папке "Семинары и упражнения". PDF-файл из архива "Семинары и упражнения", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Семинар 3. Инкапсуляция и абстрагирование. Классы.Класс представляет собой наиболее важное изменение в языке С++, предназначенное дляреализации методов ООП. Он обеспечивает представление и сокрытие данных, связываетданные с методами их обработки, предоставляет пользовательский интерфейс доступа кданным и возможность повторного использование кода, и все вышеперечисленноеупорядочивает в компактное образование (инкапсулирует).1. Объявление класса. Собственный и общедоступный разделы.
Данные и методыкласса.class Vector // объявление класса Vector (2D вектор){private: // частный раздел (по умолчанию, можно опустить)double x; // данные классаdouble y;public:// публичный разделvoid show(); // прототип метода (функции-элемента) классаvoid set(double, double); //(интерфейс)};2.
Определение методов класса. Оператор принадлежности ::void Vector::set(double xx, double yy){x = xx;y = yy;}void Vector::show(){cout << "x = " << x << ", y = " << y;}3. Использование классов: создание объектов класса, вызов общедоступных методовvoid main(){Vector v1; // создание объекта v1 (экземпляра класса Vector)v1.set(1.1, 2.2); // вызов методаv1.show(); // x = 1.1 y = 2.2}4. Некоторые особенности4.1 Вызов в функции main() метода show() без указания объекта:show();приведет к ошибке.
Однако внутри другого метода это допустимо. В этом случае объектом по умолчаниюявляется тот объект, для которого вызван первый метод:void Vector::set(double xx, double yy){x = xx;y = yy;show(); // так можно}4.2 Публичные данные и собственные методы.class Vector{private:double x;void show();public:double y;void set(double, double);};void main(){Vector v1;v1.set(1.1, 2.2);cout << v1.y; // можно, т.к. y объявлено в общедоступном разделеcout << v1.х; // ошибка, т.к. x объявлено в собственном разделеv1.show(); // ошибка, т.к.
show является общедоступным методом}Примечание: при этом вызов show() в методе set() по-прежнему возможен.5. КонструкторыВ Си++ базовых типов и структур могут быть легко инициализированы в момент ихобъявления, например:struct Vec {double x; double y;};Vec v = {1.1, 1.2};Для объектов так сделать нельзя, в частности, и потому, что данные класса могутнаходиться в собственном разделе и являться недоступными. Для решения этой проблемыв Си++ зарезервированы специальные функции – конструкторы. Это такие функции,имена которых совпадают с именем класса, а вызываются они автоматически в моментсоздания объекта.
Возвращаемый тип у конструкторов не указывается!class Vector // объявление класса Vector{private: // частный раздел (по умолчанию, можно опустить)double x; // данные классаdouble y;public:// публичный разделvoid show(); // прототип метода классаvoid set(double, double);Vector(double, double); // прототип конструктора};Vector::Vector(double xx, double yy){x = xx;y = yy;}void Vector::set(double xx, double yy){x = xx;y = yy;}2void Vector::show(){cout << "x = " << x << ", y = " << y;}void main(){Vector v1 = Vector(1.1, 2.2);//создание объекта v1, вызывается конструктор с двумя аргументамиVector v2(1.2, 2.3); // компактная форма, неявный вызов конструктораv1.show();v2.show();}Конструкторы, также как и обычные функции, могут быть перегружены или иметьпараметры со значениями по умолчанию.
В следующем примере в классе Vectorобъявлены два конструктора: один с двумя параметрами, второй из которых имеетзначение по умолчанию, и один без параметров, инициализирующий единичный векторвдоль оси x (x=1, y=0).class Vector{private:double x;double y;public:void show() {cout << "x = " << x << ", y = " << y;}; // тело методаVector();Vector(double, double);};Vector::Vector(){x = 1.;y = 0.;}Vector::Vector(double xx, double yy=0.){x = xx;y = yy;}void main(){Vector v1(1.1, 2.2); // вызывается конструктор с двумя параметрамиVector v2; //вызывается конструктор без параметровv1.show();v2.show();}Примечания.1.
Если не объявлен ни один конструктор, то для построения объекта классаиспользуется неявный конструктор по умолчанию. У него нет параметров, иинициализация данных им не осуществляется.2. Из одного конструктора можно вызвать другой конструктор (например, с другимчислом параметров). При этом второй конструктор создаст временный объект.3.
В данном примере метод show() описан внутри класса. Это эквивалентнодобавлению модификатора inline при стандартном описании метода вне класса.36. Список инициализаторовОбычная инициализация элементов данныхв конструктореVector::Vector(double xx, double yy=0.){x = xx;y = yy;}Инициализация с использованием спискаинициализаторов (после : и до {})Vector::Vector(double xx, double yy=0.) :x(xx), y(yy){}7.
ДеструкторыДеструктор – это специальная функция, которая вызывается автоматически в моментуничтожения объекта. Его основанная задача уничтожить оставшийся «мусор». Например,если конструктор использует оператор new для выделения памяти, то деструктор спомощью оператора delete может ее освободить.За деструктором зарезервировано имя, совпадающее с именем класса, которомупредшествует тильда “~”. Так, деструктор класса Vector имеет имя ~Vector(). Удеструктора отсутствует не только возвращаемое значение, но и какие либо аргументы.Пример. Добавим в публичный раздел класса Vector прототип деструктора~Vector();Для демонстрации того, когда вызывается деструктор, запишем его в виде:Vector::~Vector(){cout << "Bye!\n";}8.
Присвоение объектовОдин объект можно присвоить другому объекту того же типа (класса). Например,void main(){Vector v1(1.1, 2.2);Vector v2;v2 = v1; //все значения элементов данных объекта v1 копируются в объект v2v2.show();}По умолчанию значения каждого элемента исходного объекта копируются в соответствующий элемент целевого объекта.9. Константные (readonly) методыclass Vector{…public:void show();…}…Vector v1;v1.show(); // Okconst Vector v2;v2.show(); // Ошибка, нет уверенности,что метод не изменит константный вектор4class Vector{…public:void show() const; // метод можетиспользовать элементы данных класса только на чтение…}…const Vector v2;v2.show(); // Ok10.
Целочисленные константы с областью видимости - классclass MyClass{const int Len = 10; // Ошибка. Неверный оператор присваивания внутри класса…}Два варианта:class MyClass{enum {Len = 10};char c[Len];…}class MyClass{static const int Len = 10;char c[Len];…}11. Указатель thisЭто зарезервированный указатель на текущий объект (для которого вызван метод).Пример. Предположим мы хотим написать метод comp, который сравнивает длинытекущего вектора и вектора, передаваемого ему по ссылке, и выдает ссылку на большийвектор:const Vector & Vector::comp(const Vector & v){if (v.x*v.x + v.y*v.y > x*x + y*y) return v;else return *this;}Использование указателя this позволяет вернуть текущий вектор или ссылку на него(*this).12. Массив объектовVector var[10];var[3].show();Обязательным условием является наличие в классе конструктора по умолчанию (безпараметров).Литература.Стивен Прата.
"Язык программирования Си++. Лекции и упражнения. Учебник: Пер. С англ." - ОООДиаСофтЮП, 2004. Глава 10.5Упражнение С3_1.1. Создайте класс Vector, описанного выше вида, для хранения и обработки двумерных векторов. Задайтеконструкторы и деструктор класса. Предусмотрите конструктор с двумя параметрами (декартовыкоординаты вектора x и у), с одним параметром (вектор вдоль оси x) и без параметров (единичный векторвдоль оси x). Предусмотрите описанные в примерах методы set и show.2. Добавьте в конструктор вывод на экран информационного сообщения «Создан объект», а в деструктор –«Удален объект».3. Напишите метод, который «растягивает» вектор в произвольное число раз, метод, возвращающий модульвектора, и метод, который создает новый вектор, равный сумме двух векторов.4. В основной функции создайте два объекта класса Vector с координатами, задаваемыми пользователем склавиатуры, второй - со значениями координат по умолчанию.
С помощью метода show() выведитекоординаты обоих векторов на экран.5. Поменяйте значения координат двух векторов. С помощью метода show() выведите координаты обоихвекторов на экран.6. Растяните один из векторов в три раза и с помощью метода show() выведите координаты растянутоговектора.7. Сложите два вектора и выведите на экран координаты суммарного вектора.Упражнение С3_2.1. Создайте класс MyTime для хранения и обработки времени, заданного часами и минутами (принимаютзначения от 0 до 59). Создайте конструктор класса.
Предусмотрите возможность создания объекта спередачей конструктору 1) часов и минут, 2) только минут (без ограничения 59) и 3) по умолчанию.Предусмотрите метод set для установки значений часов и минут в объекте, метод show для выдачихранимого объектом времени на экран и метод sum для добавления к объекту времени другого объекта.2. Создайте два объекта класса MyTime и продемонстрируйте возможности ваших методов.Упражнение С3_3.1.