close

Вход

Забыли?

вход по аккаунту

?

Презентация

код для вставкиСкачать
Объектно-ориентированное
программирование
2013-2014
Для кого этот курс и что он дает?
2
Область применения ООП
Desktop
Web
Mobile
Enterprise
HighLoad
3
Путь
------------------------------------------------------------I
ООП + язык
UI
------------------------------------------------------------СДиА + STL
Design
II
DB
Net
BOOST
------------------------------------------------------------III
Многопоточность
ОС
Dev
------------------------------------------------------------4
Литература
Герберт Шилдт
Брюс Эккель
Харви и Пол Дейтел
«Самоучитель С++»
«Философия С++»
«Как программировать на С++»
WEB
www.infosystemology.ru
5
Первая программа на языке С++
#include
<iostream>
int main()
{
std::cout
return 0;
}
<<
"Hello, world! \n";
6
Лекция №1
Введение в ООП
7
Классы и объекты
8
Задача: необходимо реализовать хранение данных о размере прямоугольника,
реализовать возможность вычисления его периметра и площади.
9
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);
10
Объявление класса и создание объекта
class Rectangle
{
int width;
int height;
void main()
{
Rectangle rect;
int p = rect.Perimeter();
}
int Square()
{
return width * height;
}
int Perimeter()
{
return (width + height) * 2;
}
}
Данные, методы, абстрагирование, идентичность
11
В C++ основной единицей программирования является класс.
Классы являются программными аналогами понятий и предметов реального мира.
Класс – это данные и методы для работы с ними, объединенные в целостную группу
(Класс = Данные + Методы).
Лозунг ООП:
«Всё есть объект».
12
Инкапсуляция и спецификаторы доступа
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;
}
}
13
Rectangle rect;
rect.Set(3, 5);
int square
= rect.Square();
int perimeter = rect.Perimeter();
int w = rect.width;
14
Конструктор
class Rectangle
{
int width;
int height;
public:
Rectangle()
{
width = 0;
height = 0;
}
}
15
Проектирование программы
1. Из каких сущностей состоит задача? Делаем их классами, соблюдая принцип
единой ответственности.
2. Наполняем каждый классе данными, отражающими ключевые характеристики
сущности (?).
3. Добавляем в класс методы, реализующие необходимое поведение класса,
оставляя в интерфейсе класса только необходимое (?).
4. Связываем классы в единую систему.
16
Данные
17
Базовые ТД
Целые*
short
int
long
__int64**
(2)
(4)
(4)
(8)
Логический
bool
(1)
Дробные
float
(4)
double (8)
true / false
Символы и строки
char
string
(1)
Пустой
void
* Могут сочетаться с модификатором unsigned
** Платформо-зависимый
18
Тип bool
bool isEqual =
true;
(a == b);
// булево значение
// логическое выражение (его результат
// значение типа bool)
if (flag) // if (flag == true)
{
…
}
if (!flag) // if (flag != true)
{
…
}
19
Поля данных и переменные
Глобальные:
- не используются в С++
Локальные:
1. Объявляются внутри метода (или в любом другом блоке).
2. Видны только в пределах блока объявления.
В классе:
1. Время жизни = времени жизни объекта.
2. Видны всем методам класса.
видимость = существование?
20
Область видимости
{
int max = 2;
{
int a=1, b=2;
int max;
if (a > b)
{
int max = a;
}
else
{
int max = b;
}
std::cout << max;
//??
}
}
21
Что не так с этим кодом?
int length;
if (str != NULL)
{
length = strlen(str);
}
std::cout << length;
class Foo
{
int a;
int b;
public:
Foo()
{
a = 0;
}
};
22
Объявление + инициализация
Локальные переменные:
1. объявляем переменные там, где они нужны
2. совмещаем объявление + инициализация
Поля класса:
- инициализируем в конструкторе, гарантируем консистентность объекта
// Плохо
int sum;
sum = 0;
// Хорошо
int sum = 0;
С: объявления в начале блока
C++: объявления в любом месте
23
Литералы
// Целочисленные
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";
std::string str = "строка текста";
24
float pi = 3.14; //?
char* str = "qwerty";
str[0] = '1'; //?
char str[] = "qwerty";
str[0] = '1'; //?
25
Методы
26
class Date
{
int year;
public:
bool IsLeap()
{
if (year % 4 == 0) return true;
}
};
27
Перегрузка функций
int min(int a, int b)
{
return a < b ? a : b;
}
int main()
{
std::cout << min(2, 5);
int a[] = {1, 2, 3, 4, 5};
min(a) - ?
return 0;
}
28
class String
{
public:
void Set(const char* str);
void Set(char str, int count);
}
Перегрузка – это возможность написания нескольких функций с
одинаковыми именами, но различными формальными (входными) параметрами.
29
Совокупность формальных параметров функции называется сигнатурой.
Сигнатуры различаются по:
• типу параметров
• их количеству
• их очередности
• Фактические параметры определяют, какую версию функции нужно вызвать.
• При перегрузке тип возвращаемого значения не учитывается.
• Адреса вызовов определяются на стадии компиляции (раннее связывание).
При связывании, компилятор в первую очередь ищет такую версию
перегруженной функции, сигнатура которой в точности соответствует
параметрам вызова.
Если такая версия не найдена, то допускается неявное преобразование типов.
30
Полное соответствие:
Неявные преобразования типа:
void func(int x) {......}
void Func(double x)
void func(double x) {.....}
{
}
void func(int x, int y) {....}
void Func(int x, int y)
void main()
{
func(3, 5);
func(1.25);
func(100);
}
{
}
void main()
{
Func(1.25, 10); // Потеря!
Func(100);
// Нет потерь
}
Преобразование типа с потерей – уменьшение количества значащих разрядов
числа, возможно при:
• переходе от вещественного числа к целому (например float->int)
• переходе к типу с меньшей размерностью (например int->char)
31
Операторы
if
if (str[0] != ' ' && str != NULL)
{
}
?
if (str != NULL && str[0] != ' ')
{
}
32
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
Continue,
Break,
Break(n)?
for
for (int i=0; i<N; i++)
{
...
}
int a[] = {1, 2, 3, 4, 5};
for (auto item : a)
{
std::cout << item;
}
C++11
35
for (int i=0; i<count; ++i)
{
if (array[i] % 2 == 0)
{
if (array[i] % 100 != 0)
{
std::cout << array[i] << " ";
}
}
}
36
for (int i=0; i<count; ++i)
{
if (array[i] % 2 == 0 &&
array[i] % 100 != 0)
{
std::cout << array[i] << " ";
}
}
37
for (int i=0; i<count; ++i)
{
if (array[i] % 2 != 0)
continue;
if (array[i] % 100 == 0) continue;
std::cout << array[i] << " ";
}
38
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
Документ
Категория
Презентации по информатике
Просмотров
5
Размер файла
253 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа