Объектно-ориентированное программирование
2 Для кого этот курс и что он дает?
3 Область применения ООП Desktop Web Mobile Enterprise HighLoad
4 Путь ООП + язык СДиА + STL Многопоточность BOOST ОС UI DBNet Dev Design I II III
Герберт Шилдт «Самоучитель С++» Брюс Эккель «Философия С++» Харви и Пол Дейтел «Как программировать на С++» Литература WEB 5
6 Первая программа на языке С++ #include int main() { std::cout
Лекция 1 Введение в ООП 7
8 Классы и объекты
9 Задача: необходимо реализовать хранение данных о размере прямоугольника, реализовать возможность вычисления его периметра и площади.
10 int CalcRectangleSquare(int a, int b) { return a * b; } int CalcRectanglePerimeter(int a, int b) { return (a + b) * 2; } // Стороны прямоугольника int a = 3; int b = 5;... // Площадь int s = CalcRectangleSquare(a, b); // Периметр int p = CalcRectanglePerimeter(a, b);
11 Объявление класса и создание объекта Данные, методы, абстрагирование, идентичность class Rectangle { int width; int height; int Square() { return width * height; } int Perimeter() { return (width + height) * 2; } void main() { Rectangle rect; int p = rect.Perimeter(); }
12 В C++ основной единицей программирования является класс. Классы являются программными аналогами понятий и предметов реального мира. Класс – это данные и методы для работы с ними, объединенные в целостную группу (Класс = Данные + Методы). Лозунг ООП: «Всё есть объект».
13 class Rectangle { private: int width; int height; public: void Set(int w, int h) { width = w; height = h; } int Square() { return width * height; } int Perimeter() { return (width + height) * 2; } Инкапсуляция и спецификаторы доступа
14 Rectangle rect; rect.Set(3, 5); int square = rect.Square(); int perimeter = rect.Perimeter(); int w = rect.width;
15 Конструктор class Rectangle { int width; int height; public: Rectangle() { width = 0; height = 0; }
16 Проектирование программы 1. Из каких сущностей состоит задача? Делаем их классами, соблюдая принцип единой ответственности. 2. Наполняем каждый классе данными, отражающими ключевые характеристики сущности (?). 3. Добавляем в класс методы, реализующие необходимое поведение класса, оставляя в интерфейсе класса только необходимое (?). 4. Связываем классы в единую систему.
17 Данные
18 Целые*Дробные Символы и строки short (2) int (4) long (4) __int64**(8) float (4) double (8) char (1) string Логический bool (1) true / false Пустой void * Могут сочетаться с модификатором unsigned ** Платформо-зависимый Базовые ТД
19 bool isEqual = if (flag) // if (flag == true) { … } if (!flag) // if (flag != true) { … } true; // булево значение (a == b); // логическое выражение (его результат // значение типа bool) Тип bool
20 Поля данных и переменные Глобальные: - не используются в С++ Локальные: 1. Объявляются внутри метода (или в любом другом блоке). 2. Видны только в пределах блока объявления. В классе: 1. Время жизни = времени жизни объекта. 2. Видны всем методам класса. видимость = существование?
21 { int max = 2; { int a=1, b=2; int max; if (a > b) { int max = a; } else { int max = b; } std::cout
22 int length; if (str != NULL) { length = strlen(str); } std::cout
Объявление + инициализация 23 С: объявления в начале блока C++: объявления в любом месте // Плохо int sum; sum = 0; // Хорошо int sum = 0; Локальные переменные: 1. объявляем переменные там, где они нужны 2. совмещаем объявление + инициализация Поля класса: - инициализируем в конструкторе, гарантируем консистентность объекта
Литералы // Целочисленные int x = 42; int y = 010; short p = 0x7fff; long l = 100L; resize(640, 480); // Вещественные float f = 1.618f; double d = 3.14; double G = 6.673e-11; // Строковые char c = '\n'; char* str = "qwerty"; 24 std::string str = "строка текста";
char* str = "qwerty"; str[0] = '1'; //? char str[] = "qwerty"; str[0] = '1'; //? 25 float pi = 3.14; //?
26 Методы
27 class Date { int year; public: bool IsLeap() { if (year % 4 == 0) return true; } };
28 Перегрузка функций int min(int a, int b) { return a < b ? a : b; } int main() { std::cout
29 Перегрузка – это возможность написания нескольких функций с одинаковыми именами, но различными формальными (входными) параметрами. class String { public: void Set(const char* str); void Set(char str, int count); }
30 Совокупность формальных параметров функции называется сигнатурой. Сигнатуры различаются по: типу параметров их количеству их очередности Фактические параметры определяют, какую версию функции нужно вызвать. При перегрузке тип возвращаемого значения не учитывается. Адреса вызовов определяются на стадии компиляции (раннее связывание). При связывании, компилятор в первую очередь ищет такую версию перегруженной функции, сигнатура которой в точности соответствует параметрам вызова. Если такая версия не найдена, то допускается неявное преобразование типов.
31 Полное соответствие: void func(int x) {......} void func(double x) {.....} void func(int x, int y) {....} void main() { func(3, 5); func(1.25); func(100); } Неявные преобразования типа: Преобразование типа с потерей – уменьшение количества значащих разрядов числа, возможно при: переходе от вещественного числа к целому (например float->int) переходе к типу с меньшей размерностью (например int->char) void Func(double x) { } void Func(int x, int y) { } void main() { Func(1.25, 10); // Потеря! Func(100); // Нет потерь }
if if (str != NULL && str[0] != ' ') { } 32 if (str[0] != ' ' && str != NULL) { } ? Операторы
switch switch(type) { case GeoType::point: case GeoType::line: return 0; case GeoType::square:... case GeoType::sphere:... break; default: assert(false); }; 33
? : int max = a > b ? a : b; 34
for for (int i=0; i
36 for (int i=0; i
37 for (int i=0; i
38 for (int i=0; i
while while (query->Fetch()) {... } std::string buf; std::string psw = "qwerty"; do { std::cin >> buf; } while (buf != psw); 39
Приоритет и ассоциативность операций // Приоритет? b = a + 10; // Ассоциативность? d = c + b + a; d = a = b = c; 40
41
int monthsLengths[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int month = 2; int year = 2012; int daysCount = monthsLengths[month] + (month == 2 && year % 4 == 0) ? 1 : 0; 42