3 (972471)
Текст из файла
Семинар 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.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.