a7c58723bfc46939ca3f371a65e3c31c.ppt
- Количество слайдов: 23
С++, начала ООП Семинар 1 Рябова Анна Сергеевна ryabova. anna@gmail. com
Некоторые отличия C++ от C o o /* комментарий в стиле C */ // Пример комментария в С++ Значения аргументов по умолчанию int factorial( int n=0) o Неименованные параметры int f(int x, int z) { return x+z; } o Создание переменных в любом месте программы for(int i = 0; i < 5; i++) o inline функции макрос #define sqr(x) ((x)*(x)) : в тексте программы замена sqr(i) на ((i)*(i)). если sqr(i++), чему равно i? inline int sqr(int i) { return i*i; }
Некоторые отличия C++ от C o o Доступ к замаскированной глобальной переменной int i; // global scope variable void f() { int i; i = 0; // Local i used : : i=0 // Global i used, would be impossible in C } Операторы new/delete для работы с памятью int *p = malloc(sizeof(int)); free(p); int *p = new int; delete p; int *q = malloc(5 * sizeof(int)); free(q); int *q = new int[5]; delete[] q;
Некоторые отличия C++ от C o пространства имен namespace kids { int get. Work. Days {. . . }; }; namespace adults { int get. Work. Days {. . . }; }; if(adults: : get. Work. Days() <= kids: : get. Work. Days()) cout << “You are lucky adult!” o перегрузка функций int max(int x, int y) { return x>y ? x : y ; } double max(double x, double y) { return x>y ? x : y ; } int a; a = max(1, 3); double d; d = max(2. 5, -1. 0);
Некоторые отличия C++ от C o Потоки ввода-вывода #include <string> #include <iostream> using namespace std; int main() { string name; int age; cout << "Enter your name and age" << endl; cin >> name >> age ; cout << "Hello " << name << ", your age is " << age << endl; return 0; }
Некоторые отличия C++ от C o ссылки int i; int& ref = i; //обязательно явно инициализировать ссылку! ref = 3 //i станет равно 3 // C-style (pointers) void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int i = 1, j = 2; swap(&i, &j); // Now i==2 and j==1 int& ret_arg(int &arg) { return arg; } int i; ret_arg(i) = 2; // Now i==2 // C++-style (references) void swap(int& a, int& b) { int temp = a; a = b; b = temp; } int i = 1, j = 2; swap(i, j); // Now i==2 and j==1
Структура struct Complex { int Re; //Действительная часть int Im; //Мнимая часть } struct Complex a; a. Re = 1; a. Im = 0; struct Complex *p = &a; p->Im = 0; Структура не знала, как будут использоваться ее данные struct Complex add(struct Complex a, struct Complex b) { struct Complex result; result. Re = a. Re + b. Re; result. Im = a. Im + b. Im; return result; }
Структура: недостатки o с = add(a, b) вместо c = a + b o если функция должна изменить аргумент, надо передавать адрес структуры o нет защиты от некорректных действий o создание комплексного числа – объявление переменной, инициализация полей o если структура имеет дело с памятью (содержит указатели), то надо следить за памятью при возврате из функций
Структура в C++ o Имя структуры – имя типа: Complex a; вместо struct Complex a; Структура может содержать методы struct Complex { int Re; //Действительная часть int Im; //Мнимая часть double module(); } double Complex: : module() { return sqrt(Re*Re + Im*Im); } o Complex a; a. Re = 1; a. Im = 3; double mod = a. module();
Структуры: доступ o o private – личные данные, доступны только методам структуры public – доступны всем (по умолчанию все поля публичные) struct Complex { private: int Re; //Действительная часть int Im; //Мнимая часть public: int get. Re() const { return Re; } int get. Im() const { return Im; } int set. Value(int re, int im) { if(re == im) { // Сообщить об ошибке return; } Re = re; Im = im; } }
Классы o o Превратить структуру в класс очень просто – надо заменить ключевое слово struct на class. Отличие - права доступа по умолчанию. В классе все поля и функции, для которых явно не указан уровень доступа, считаются личными (private) struct Complex { private: int Re; int Im; o o class Complex { int Re; int Im; Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом. Интерфейс – это набор методов класса, доступных для использования другими классами.
Классы: конструктор o o Конструктор – метод, который вызывается при создании нового экземпляра класса Имя совпадает с именем класса Тип возвращаемого значения отсутсвтует Один класс может содержать несколько конструкторов с разным набором параметров, нужный выбирается автоматически class Complex { int Re, Im; public: Complex(int re, int im = 0) { Re = re; Im = im; } Complex() { Re = 0; Im = 0; } }; Complex a(1, 1), b(3), c; //Использование o В конструкторе может содержаться выделение памяти, открытие файлов и т. п.
Классы: конструктор копирования o o o Копирующий конструктор позволяет инициализировать новый объект другим объектом того же типа A: : A(const A&); Если не задан явно, создается автоматически Автоматический конструктор - почленное копирование Если поле – объект другого класса, почленное копирование вызывает копирующий конструктор для этого поля Для встроенных типов и для классов почленное копирование – побитовое копирование содержимого из одного объекта в другой class Complex { int Re, Im; public: Complex(Complex c) { Re = c. Re; Im = c. Im; } }; Complex b(2, 3); //Обычный конструктор Complex a(b); //Конструктор копирования
Классы: деструктор Деструктор – метод, котрый вызывается при удалении объекта o Имя совпадает с именем класса, с префиксом ~ (тильда (в левом верхнем углу клавиатуры)) o Не имеет параметров o class Complex { … public: ~Complex() { } } o В деструкторе можно освобождать память, закрывать файлы
Классы: друзья o o o Если все же нужен доступ к private полям? (Например, функции требуется полный доступ к полям двух классов) Друзья класса - функции и классы, у которых есть полный доступ к private полям класса (такой же доступ, как у его собственных функций). Ключевое слово friend Функция print_fields(A a) имеет полный доступ к private полям класса A. friend-объявление распространяется только на функцию с указанной сигнатурой, в нашем случае print_fields(A), а не на все функции с именем print_fields. friend class B; делает поля класса A доступными для всех функцийчленов класса B. class B; class A { int n 1, n 2; friend void print_fields(A a); friend class B; public: set_fields(n_1, n_ 2) { n 1 = n_1; n 2 = n_2; } }; void print_fields(A a) { cout << a. n 1 << " " << a. n 2 << endl; }
Операторы: сложение Можно определить для класса стандартные операторы (+, * и т. д. ) class Complex { … Complex operator+(const Complex& b) { Complex result(Re + b. Re, Im + b. Im); return result; } }; o Параметр передается по ссылке, чтобы избежать лишнего копирования o Использование: Complex a(1, 1), b(2, 2), c; c = a+b; //Вызовется a. operator+(b); o
Операторы: присваивание o Оператор присваивания тоже можно переопределить class Complex { … Complex& operator=(const Complex& b) { if(&b != this) { Re = b. Re; Im = b. Im; } return *this; } } o o Возвращает ссылку, чтобы можно было писать цепочку присваивания a=b=c Похож на конструктор копирования, но объект уже создан Complex a = b; //Конструктор копирования a = b; //Присваивание
Операторы: приведение типа class Complex { … operator double() const { return sqrt(Re*Re + Im*Im); } }; Complex a(2, 2); double b = sqrt(a);
Дополнительно o Оператор new вызывает конструктор, delete - деструктор
Литература o Х. Дейтел, П. Дейтел Как программировать на C++ o Бьярн Страуструп Справочное руководство по C++ o Лаптев В. В. и др. С++. Объектно-ориентированное программирование o http: //users. msu. dubna. ru/~ovg/c++course o http: //info. fenster. name/
Упражнение 1 Реализовать класс Some. Class. o Продумать структуру (количество и тип полей). o Обязательно должны быть: А) Конструктор, в котором кроме инициализации полей объекта должна выводиться строка вида «Создан объект класса Some. Class» Б) Деструктор, в котором кроме освобождения памяти (если необходимо по заданию) должна выводиться строка вида «Уничтожен объект класса Some. Class» В) Метод вывода на экран Display o Реализовать какой-либо метод, по смыслу относящийся к данному классу. Возможные классы: o Point – точка в декартовой СК o Rational – рациональная дробь o Money – деньги o Data – календарная дата o Time – Время o Auto – Автомобиль (марка, год выпуска) o User – Пользователь (форума, компьютера) o Vector 3 D – вектор в трехмерном пространстве o Triangle – треугольник o Company – фирма o …
Задание 1 Реализовать класс Vector для работы с целочисленными векторами в n-мерном пространстве. Вектор задается как динамический массив целых чисел ( int*) и помнит свою длину. class Vector { private: int n; int* data; }; Аккуратно работайте с памятью: выделение – в конструкторе, освобождение в деструкторе. Необходимо реализовать: на тройку: o Конструктор по умолчанию o Конструктор с заданной длиной вектора Vector(int) o Конструктор Vector(int size, int value), заполняющий весь вектор значениями value o Деструктор o Операцию вычисления длины вектора (корень из суммы квадратов) o Скалярное произведение на четверку o Конструктор копирования o Оператор operator+ o Оператор присваивания на пятерку o Обращение по индексу o
Требования o o o Всего будет 4 задачи За задачу можно получить 5, 4, 3 или 0 баллов Итоговая оценка – среднеарифметическое За одно занятие сдавать не более двух заданий Начинать сдавать задания не позже 1 декабря Можно сдавать задачу по частям (сначала на 3, потом повысить оценку)
a7c58723bfc46939ca3f371a65e3c31c.ppt