420 likes | 602 Views
Объектно-ориентированное программирование. 2013-2014. Для кого этот курс и что он дает?. Область применения ООП. Desktop. Web. Mobile. Enterprise. HighLoad. Путь. -------------------------------------------------------------. ООП + язык. UI. I.
E N D
Объектно-ориентированное программирование 2013-2014
Область применения ООП Desktop Web Mobile Enterprise HighLoad
Путь ------------------------------------------------------------- ООП +язык UI I ------------------------------------------------------------- СДиА + STL Design II DB Net BOOST ------------------------------------------------------------- Многопоточность ОС Dev III -------------------------------------------------------------
Литература Герберт Шилдт «Самоучитель С++» Брюс Эккель «Философия С++» Харви и Пол Дейтел «Как программировать на С++» WEB www.infosystemology.ru
Первая программа на языке С++ #include<iostream> intmain() { std::cout << "Hello, world! \n"; return 0; }
Лекция №1 Введение в ООП
Задача: необходимо реализовать хранение данных о размере прямоугольника, реализовать возможность вычисления его периметра и площади.
intCalcRectangleSquare(inta, int b) { return a * b; } intCalcRectanglePerimeter(inta, int b) { return (a + b) * 2; } // Стороны прямоугольника int a = 3; int b = 5; ... // Площадь int s = CalcRectangleSquare(a, b); // Периметр int p = CalcRectanglePerimeter(a, b);
Объявление класса и создание объекта classRectangle { int width; intheight; int Square() { return width * height; } int Perimeter() { return(width + height) * 2; } } void main() { Rectangle rect; intp = rect.Perimeter(); } Данные, методы, абстрагирование, идентичность
В C++основной единицей программирования является класс. Классы являются программными аналогами понятий и предметов реального мира. Класс – это данные и методы для работы с ними, объединенные в целостную группу (Класс = Данные + Методы). Лозунг ООП: «Всё есть объект».
Инкапсуляция и спецификаторы доступа classRectangle { private: int width; intheight; public: void Set(intw, inth){ width = w; height = h; } intSquare(){ return width * height; } intPerimeter(){ return(width + height) * 2; } }
Rectanglerect; rect.Set(3, 5); intsquare = rect.Square(); intperimeter = rect.Perimeter(); int w = rect.width;
Конструктор classRectangle { int width; intheight; public: Rectangle() { width = 0; height = 0; } }
Проектирование программы Из каких сущностей состоит задача? Делаем их классами, соблюдая принцип единой ответственности. Наполняем каждый классе данными, отражающими ключевые характеристики сущности (?). Добавляем в класс методы, реализующие необходимое поведение класса, оставляя в интерфейсе класса только необходимое (?). Связываем классы в единую систему.
Базовые ТД Целые* Дробные short (2) int (4) long (4) __int64**(8) float(4) double(8) Логический bool(1) true/false Символы и строки char(1) string Пустой void * Могут сочетаться с модификатором unsigned ** Платформо-зависимый
Тип bool true; // булево значение (a == b); // логическое выражение (егорезультат // значение типа bool) boolisEqual = if(flag) // if (flag == true) { … } if(!flag) // if (flag != true) { … }
Поля данных и переменные • Глобальные: • - не используются в С++ • Локальные: • 1. Объявляются внутри метода (или в любом другом блоке). • 2. Видны только в пределах блока объявления. • В классе: • 1. Время жизни = времени жизни объекта. • 2. Видны всем методам класса. видимость = существование?
Область видимости • { • int max = 2; • { • inta=1, b=2; • int max; • if (a > b) • { • intmax = a; • } • else • { • intmax = b; • } • std::cout << max; //?? • } • }
Что не так с этим кодом? • classFoo • { • int a; • int b; • public: • Foo() • { • a = 0; • } • }; int length; if (str != NULL) { length = strlen(str); } std::cout << length;
Объявление + инициализация Локальные переменные: 1. объявляем переменные там, где они нужны 2. совмещаем объявление + инициализация Поля класса: - инициализируем в конструкторе, гарантируем консистентность объекта // Плохо intsum; sum = 0; // Хорошо intsum = 0; С: объявления в начале блока C++: объявления в любом месте
Литералы // Целочисленные int x= 42; inty= 010; short p = 0x7fff; longl= 100L; resize(640, 480); // Вещественные float f = 1.618f; double d = 3.14; double G = 6.673e-11; // Строковые char c = '\n'; char* str = "qwerty"; std::stringstr= "строка текста";
float pi = 3.14;//? char* str = "qwerty"; str[0] = '1'; //? charstr[] = "qwerty"; str[0] = '1'; //?
classDate • { • intyear; • public: • boolIsLeap() • { • if (year % 4 == 0) returntrue; • } • };
Перегрузка функций • int min(inta, intb) • { • returna < b ? a : b; • } • int main() • { • std::cout << min(2, 5); • int a[] = {1, 2, 3, 4, 5}; • min(a) - ? • return 0; • }
classString • { • public: • void Set(constchar* str); • void Set(charstr, int count); • } Перегрузка – это возможность написания нескольких функций с одинаковыми именами, но различными формальными (входными) параметрами.
Совокупность формальных параметров функции называется сигнатурой. • Сигнатуры различаются по: • типу параметров • их количеству • их очередности • Фактические параметры определяют, какую версию функции нужно вызвать. • При перегрузке тип возвращаемого значения не учитывается. • Адреса вызовов определяются на стадии компиляции (раннее связывание). При связывании, компилятор в первую очередь ищет такую версию перегруженной функции, сигнатура которой в точности соответствует параметрам вызова. Если такая версия не найдена, то допускается неявное преобразование типов.
Неявные преобразования типа: Полное соответствие: void func(int x) {......} voidfunc(double x) {.....} voidfunc(int x, int y) {....} void main() { func(3, 5); func(1.25); func(100); } voidFunc(double x) { } void Func(int x, int y) { } void main() { Func(1.25, 10); // Потеря! Func(100); // Нет потерь } • Преобразование типа с потерей – уменьшение количества значащих разрядов числа, возможно при: • переходе от вещественного числа к целому (например float->int) • переходе к типу с меньшей размерностью(например int->char)
Операторы if if (str[0] != ' ' && str != NULL) { } ? if(str != NULL && str[0] != ' ') { }
switch switch(type) { caseGeoType::point: caseGeoType::line: return0; caseGeoType::square: ... caseGeoType::sphere: ... break; default: assert(false); };
? : intmax = a > b ? a : b;
for Continue, Break, Break(n)? for (int i=0; i<N; i++) { ... } int a[] = {1, 2, 3, 4, 5}; for (auto item : a) C++11 { std::cout << item; }
for (int i=0; i<count; ++i) { if (array[i] % 2 == 0) { if (array[i] % 100 != 0) { std::cout << array[i] << " "; } } }
for (int i=0; i<count; ++i) { if (array[i] % 2 == 0 && array[i] % 100 != 0) { std::cout << array[i] << " "; } }
for (int i=0; i<count; ++i) { if (array[i] % 2 != 0) continue; if (array[i] % 100 == 0) continue; std::cout << array[i] << " "; }
while while (query->Fetch()) { ... } std::string buf; std::string psw = "qwerty"; do { std::cin >> buf; } while (buf != psw);
Приоритет и ассоциативность операций // Приоритет? b = a + 10; // Ассоциативность? d = c + b + a; d = a = b = c;
intmonthsLengths[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int month = 2; int year = 2012; intdaysCount = monthsLengths[month] + (month == 2 && year % 4 == 0) ? 1 : 0;