SlideShare a Scribd company logo
1 of 20
ОСОБЕННОСТИ
ПРОГРАММИРОВАНИЯ НА
С++
Кройтор Михаил
Содержание




Указатель на функцию
Наследование
Виртуальные функции
Полиморфизм на основе виртуальных функций
 Абстрактные классы




Перегрузка операций



Функциональные объекты



Шаблоны
 Статический полиморфизм




Специализация шаблонов

Некоторые особенности стандарта C++11
Указатель на функцию




Указателем на функцию называется адрес точки
входа функции.
Объявление переменной - указателя на
функцию:
void (*pfunc)(double*, const size_t);



Объявление типа указателя на функцию:
typedef void (*pfunc_t)(double*, const size_t);
Указатель на функцию:
пример
#include <stdio.h>
typedef void (*event_t)(void*, void*);
struct Button{
size_t x, y, width, height;
char text[255];
event_t OnClick;
};
void ButtonPressed(void* /*sender*/, void* /*arg*/){
puts("button pressed!");
}
int main(){
Button btn = {5, 5, 75, 30, "Press Me!", ButtonPressed};
btn.OnClick();
return 0;
}
Наследование
Наследование – механизм, позволяющий
описать новый класс (потомок,
наследник, производный класс) на основе
существующего (предок, базовый класс,
родительский класс), с сохранением
функциональности родительского класса.
Наследование позволяет обращаться с
производными классами так же, как и с их
родительскими классами.
Указатель на объект базового класса
может ссылаться и на объект
производного класса. Обратное
утверждение неверно.

Пример наследования:
class Base {
int value;
public:
Base(): value(0){}
int getValue() { return value; }
};
class Derived: public Base{
public:
Derived() : Base() {}
void setValue(int data) {
value = data;
}
};
Наследование:
пример использования
class Entity{
protected:
std::string name;
Entity* parent;
public:
virtual std::string ToString() const = 0;
Entity* GetParent() const{ return parent; }
};
class Folder: public Entity{
std::list<Entity*> childs;
public:
Folder(std::string n, Entity* p)
: name(n), parent(p){}
std::string ToString() const { return name; }
};
Виртуальные функции
Виртуальной функцией класса
называют метод, который может быть
переопределён в потомке таким
образом, что конкретная реализация
функции для вызова будет
определяться во время исполнения.
Виртуальные функции являются одной
из основ реализации динамического
полиморфизма.

Пример:
class Base{
public:
Base(): value(0){}
virtual void show() {
std::cout << "Base" << std::endl;
}
};
class Derived: public Base{
public:
Derived() : Base() {}
virtual void show() {
std::cout << «Derived" << std::endl;
}
};
Виртуальные функции:
пример полиморфизма
class Base{
public:
Base(): value(0){}
virtual void show() { std::cout << "Base" << std::endl; }
};
class Derived: public Base{
public:
Derived() : Base() {}
virtual void show() { std::cout << "Derived" << std::endl; }
};
void print(Base* p) { p->show(); }
int main(){
Base* b = new Base();
Derived* d = new Derived();
print(b);
print(d);
return 0;
}
Виртуальные функции:
абстрактные классы
Если базовый класс только декларирует
существование виртуального метода, но
не предполагает его реализации, то такой
метод называется чистым виртуальным
или абстрактным.
Класс, содержащий хотя бы один
абстрактный метод, называется
абстрактным классом.
Любая абстрактная функция должна быть
определена в дочернем классе.
Абстрактные классы используются в том
случае, когда программист хочет
определить семейство классов с
одинаковым поведением.

struct Shape{
virtual void Draw() = 0;
virtual void Hide() = 0;
};
struct Point: Shape{
virtual void Draw(){
// draw this point
}
virtual void Hide(){
// hide this point
}
};

Абстрактные классы очень похожи
на интерфейсы из Java и C#
Перегрузка операций
полезно переопределить некоторый
оператор для класса, тогда запись
программы становится более
компактной и понятной.
Общая форма определения оператора
выглядит следующим образом:
<return_type> operator <operator_sig
n> (<operator_parametres>);

для определения, где лучше всего
определить оператор - внутри класса
или вне его, - спросите себя, изменяет
ли этот оператор свои входные
параметры. Если изменяет - то этот
оператор - часть класса. Если не
изменяет, то оператор лучше всего
определить вне класса.

сlass int_pair{
int first, second;
public:
int_pair(int f = 0, int s = 0): first(f),
second(s) {}
bool operator == (const int_pair&
p) const {
return (first == p.first) && (second
== p.second);
}
};
bool operator != (const int_pair&
p1, const int_pair& p2){
return !(p1 == p2);
}
Функциональные объекты
Если в классе переопределен оператор (),
то объекты этого класса получают
свойства функций (их можно
использовать как функции). Такие
объекты называются функциональными
или функторами.
Функторы удобно использовать, когда
функция должна обладать "памятью", а
также, как замена указателей на функции.

// функтор, подсчитывающих количество
вызовов

class _swap{
static size_t counter = 0;
static void increment() { ++counter; }
public:
_swap(){}
void operator ()(int& a, int& b){
int tmp = a;
a = b;
b = tmp;
inc();
}
int getNrCalls() {return count; }
};
_swap swap;
int a = 3, b = 5;
swap(a, b);
шаблоны




Шаблонами классов
называется семейство
классов с одинаковым
поведением
Шаблонами функций
называют семейство
функций с одинаковым
поведением

template<class TYPE>
void swap(TYPE& p1, TYPE& p2){
TYPE tmp = p1;
p1 = p2;
p2 = tmp;
}

Понятие шаблона функции часто
ассоциируется с понятием алгоритма
Шаблоны:
статический полиморфизм
int main(){
int i1 = 3, i2 = 5;
float f1 = 1.2, f2 = 2.3;
double d1 = 1.003, d2
= 10;
swap(i1, i2);
swap(f1, f2);
swap(d1, d2);
return 0;
}



Одно и то же имя
функции используется с
различными типами
данных. Данное свойство
называется статическим
полиморфизмом, потому
что определение
поведения функции
выполняется на этапе
компиляции программы.
Шаблоны:
специализация шаблонов
Для какого-то типа данных
можно указать
специальную версию
шаблона.

template<>

void swap(int* a, int* b){
int tmp = *a;
*a = *b;
*b = tmp;

}

Если шаблон (его специализация) не
используются в программе, то на этапе
компиляции он(а) не включается в
бинарный код!
С++11: автоматические типы


Ключевое слово auto
предписывает
компилятору самому
определить тип
переменной

auto val = 5;
С++11: инициализаторы


Появилась возможность
инициализировать
классы-контейнеры при
помощи списков
инициализаций.

class Array10{
int _val[10];
public:
Array10(std::initializer_list
<int> list);
};
Array10 a =
{1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
С++11: лямбда-функции
лямбда-выражения
позволяют
программистам
ускорить написание
кода. Под лямбдавыражениями
понимают
специальный способ
записи функторов.

[](int x, int y) { return x + y; }

// то же, что и [](int x, int y) ->
int{ int result = x + y; return
result; }
struct sum{
int opertator()(int x, int
y){ return x+y;}
};
C++11: нулевой указатель


Использование в качестве
нулевого указателя значения 0
в некоторых случаях
приводило к опасному коду.
Рекомендуется использовать
ключевое слово nullptr

void test(int);

void test(char*);
int main(){
test(0); // ???
test(nullptr); // !!!

return true;
}
С++11: цикл «для каждого»
int a[5] = {1, 2, 3, 4, 5};
for(auto& el: a){
++el;
}
for(auto el: a){
std::cout << el << " ";
}

В новом стандарте С++
предлагается новая
форма записи цикла
for: for( type element:
collection){}
Спасибо за внимание!

More Related Content

What's hot

Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторовDEVTYPE
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 ПерегрузкаDEVTYPE
 
Субъекторная модель
Субъекторная модельСубъекторная модель
Субъекторная модельcorehard_by
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
функции в Java script
функции в Java scriptфункции в Java script
функции в Java scriptViktor Andreev
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#Dmitri Soshnikov
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 

What's hot (20)

Подпрограммы
ПодпрограммыПодпрограммы
Подпрограммы
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторов
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
Субъекторная модель
Субъекторная модельСубъекторная модель
Субъекторная модель
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
функции в Java script
функции в Java scriptфункции в Java script
функции в Java script
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
Python: ввод и вывод
Python: ввод и выводPython: ввод и вывод
Python: ввод и вывод
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
лек9 10
лек9 10лек9 10
лек9 10
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 

Viewers also liked

Введение в MFC
Введение в MFCВведение в MFC
Введение в MFCmcroitor
 
Обзор MS.Net Framework
Обзор MS.Net FrameworkОбзор MS.Net Framework
Обзор MS.Net Frameworkmcroitor
 
создание приложений windows forms
создание приложений windows formsсоздание приложений windows forms
создание приложений windows formsmcroitor
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Javametaform
 
создание живых сайтов
создание живых сайтовсоздание живых сайтов
создание живых сайтовmetaform
 
архитектура приложений mfc
архитектура приложений mfcархитектура приложений mfc
архитектура приложений mfcmcroitor
 
mfc событийное программирование
mfc событийное программированиеmfc событийное программирование
mfc событийное программированиеmcroitor
 
0.0 particularitatile programarii с++
0.0 particularitatile programarii с++0.0 particularitatile programarii с++
0.0 particularitatile programarii с++mcroitor
 
Revizuirea framework .NET
Revizuirea framework .NETRevizuirea framework .NET
Revizuirea framework .NETmcroitor
 
mfc introducere
mfc introduceremfc introducere
mfc introduceremcroitor
 
3. biblioteci de programare
3. biblioteci de programare3. biblioteci de programare
3. biblioteci de programaremcroitor
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
Сети для самых маленьких. Часть восьмая. BGP и IP SLA
Сети для самых маленьких. Часть восьмая. BGP и IP SLAСети для самых маленьких. Часть восьмая. BGP и IP SLA
Сети для самых маленьких. Часть восьмая. BGP и IP SLANatasha Samoylenko
 

Viewers also liked (14)

Введение в MFC
Введение в MFCВведение в MFC
Введение в MFC
 
Обзор MS.Net Framework
Обзор MS.Net FrameworkОбзор MS.Net Framework
Обзор MS.Net Framework
 
создание приложений windows forms
создание приложений windows formsсоздание приложений windows forms
создание приложений windows forms
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
 
создание живых сайтов
создание живых сайтовсоздание живых сайтов
создание живых сайтов
 
архитектура приложений mfc
архитектура приложений mfcархитектура приложений mfc
архитектура приложений mfc
 
mfc событийное программирование
mfc событийное программированиеmfc событийное программирование
mfc событийное программирование
 
0.0 particularitatile programarii с++
0.0 particularitatile programarii с++0.0 particularitatile programarii с++
0.0 particularitatile programarii с++
 
Revizuirea framework .NET
Revizuirea framework .NETRevizuirea framework .NET
Revizuirea framework .NET
 
mfc introducere
mfc introduceremfc introducere
mfc introducere
 
3. biblioteci de programare
3. biblioteci de programare3. biblioteci de programare
3. biblioteci de programare
 
C++ теория
C++ теорияC++ теория
C++ теория
 
Reações ácido base
Reações ácido baseReações ácido base
Reações ácido base
 
Сети для самых маленьких. Часть восьмая. BGP и IP SLA
Сети для самых маленьких. Часть восьмая. BGP и IP SLAСети для самых маленьких. Часть восьмая. BGP и IP SLA
Сети для самых маленьких. Часть восьмая. BGP и IP SLA
 

Similar to особенности программирования на с++

C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Javaitc73
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.Igor Shkulipa
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...OdessaFrontend
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функцийDEVTYPE
 
презентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работампрезентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работамstudent_kai
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9Technopark
 
лабораторная работа №4
лабораторная работа №4лабораторная работа №4
лабораторная работа №4Zhanna Kazakova
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 

Similar to особенности программирования на с++ (20)

C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
Lec 2
Lec 2Lec 2
Lec 2
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
C# Desktop. Занятие 07.
C# Desktop. Занятие 07.C# Desktop. Занятие 07.
C# Desktop. Занятие 07.
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
лек5 6
лек5 6лек5 6
лек5 6
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функций
 
презентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работампрезентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работам
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
лабораторная работа №4
лабораторная работа №4лабораторная работа №4
лабораторная работа №4
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 

More from mcroitor

09 server mgmt_ii_ro
09 server mgmt_ii_ro09 server mgmt_ii_ro
09 server mgmt_ii_romcroitor
 
09 server mgmt_ii_ru
09 server mgmt_ii_ru09 server mgmt_ii_ru
09 server mgmt_ii_rumcroitor
 
10 server security_ro
10 server security_ro10 server security_ro
10 server security_romcroitor
 
10 server security_ru
10 server security_ru10 server security_ru
10 server security_rumcroitor
 
08 server mgmt_ro
08 server mgmt_ro08 server mgmt_ro
08 server mgmt_romcroitor
 
08 server mgmt_ru
08 server mgmt_ru08 server mgmt_ru
08 server mgmt_rumcroitor
 
07 virtual hosts_ru
07 virtual hosts_ru07 virtual hosts_ru
07 virtual hosts_rumcroitor
 
07 virtual hosts_ro
07 virtual hosts_ro07 virtual hosts_ro
07 virtual hosts_romcroitor
 
06 php instalation_ro
06 php instalation_ro06 php instalation_ro
06 php instalation_romcroitor
 
06 php instalation_ru
06 php instalation_ru06 php instalation_ru
06 php instalation_rumcroitor
 
05 db server_deployment_ro
05 db server_deployment_ro05 db server_deployment_ro
05 db server_deployment_romcroitor
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_rumcroitor
 
04 web server_deployment_ro
04 web server_deployment_ro04 web server_deployment_ro
04 web server_deployment_romcroitor
 
04 web server_deployment_ru
04 web server_deployment_ru04 web server_deployment_ru
04 web server_deployment_rumcroitor
 
03 web server_architecture_ro
03 web server_architecture_ro03 web server_architecture_ro
03 web server_architecture_romcroitor
 
03 web server_architecture_ru
03 web server_architecture_ru03 web server_architecture_ru
03 web server_architecture_rumcroitor
 
02 server hardware_ro
02 server hardware_ro02 server hardware_ro
02 server hardware_romcroitor
 
02 server hardware_ru
02 server hardware_ru02 server hardware_ru
02 server hardware_rumcroitor
 
01 server definition_ro
01 server definition_ro01 server definition_ro
01 server definition_romcroitor
 
01 server definition
01 server definition01 server definition
01 server definitionmcroitor
 

More from mcroitor (20)

09 server mgmt_ii_ro
09 server mgmt_ii_ro09 server mgmt_ii_ro
09 server mgmt_ii_ro
 
09 server mgmt_ii_ru
09 server mgmt_ii_ru09 server mgmt_ii_ru
09 server mgmt_ii_ru
 
10 server security_ro
10 server security_ro10 server security_ro
10 server security_ro
 
10 server security_ru
10 server security_ru10 server security_ru
10 server security_ru
 
08 server mgmt_ro
08 server mgmt_ro08 server mgmt_ro
08 server mgmt_ro
 
08 server mgmt_ru
08 server mgmt_ru08 server mgmt_ru
08 server mgmt_ru
 
07 virtual hosts_ru
07 virtual hosts_ru07 virtual hosts_ru
07 virtual hosts_ru
 
07 virtual hosts_ro
07 virtual hosts_ro07 virtual hosts_ro
07 virtual hosts_ro
 
06 php instalation_ro
06 php instalation_ro06 php instalation_ro
06 php instalation_ro
 
06 php instalation_ru
06 php instalation_ru06 php instalation_ru
06 php instalation_ru
 
05 db server_deployment_ro
05 db server_deployment_ro05 db server_deployment_ro
05 db server_deployment_ro
 
05 db server_deployment_ru
05 db server_deployment_ru05 db server_deployment_ru
05 db server_deployment_ru
 
04 web server_deployment_ro
04 web server_deployment_ro04 web server_deployment_ro
04 web server_deployment_ro
 
04 web server_deployment_ru
04 web server_deployment_ru04 web server_deployment_ru
04 web server_deployment_ru
 
03 web server_architecture_ro
03 web server_architecture_ro03 web server_architecture_ro
03 web server_architecture_ro
 
03 web server_architecture_ru
03 web server_architecture_ru03 web server_architecture_ru
03 web server_architecture_ru
 
02 server hardware_ro
02 server hardware_ro02 server hardware_ro
02 server hardware_ro
 
02 server hardware_ru
02 server hardware_ru02 server hardware_ru
02 server hardware_ru
 
01 server definition_ro
01 server definition_ro01 server definition_ro
01 server definition_ro
 
01 server definition
01 server definition01 server definition
01 server definition
 

особенности программирования на с++

  • 2. Содержание    Указатель на функцию Наследование Виртуальные функции Полиморфизм на основе виртуальных функций  Абстрактные классы   Перегрузка операций  Функциональные объекты  Шаблоны  Статический полиморфизм   Специализация шаблонов Некоторые особенности стандарта C++11
  • 3. Указатель на функцию   Указателем на функцию называется адрес точки входа функции. Объявление переменной - указателя на функцию: void (*pfunc)(double*, const size_t);  Объявление типа указателя на функцию: typedef void (*pfunc_t)(double*, const size_t);
  • 4. Указатель на функцию: пример #include <stdio.h> typedef void (*event_t)(void*, void*); struct Button{ size_t x, y, width, height; char text[255]; event_t OnClick; }; void ButtonPressed(void* /*sender*/, void* /*arg*/){ puts("button pressed!"); } int main(){ Button btn = {5, 5, 75, 30, "Press Me!", ButtonPressed}; btn.OnClick(); return 0; }
  • 5. Наследование Наследование – механизм, позволяющий описать новый класс (потомок, наследник, производный класс) на основе существующего (предок, базовый класс, родительский класс), с сохранением функциональности родительского класса. Наследование позволяет обращаться с производными классами так же, как и с их родительскими классами. Указатель на объект базового класса может ссылаться и на объект производного класса. Обратное утверждение неверно. Пример наследования: class Base { int value; public: Base(): value(0){} int getValue() { return value; } }; class Derived: public Base{ public: Derived() : Base() {} void setValue(int data) { value = data; } };
  • 6. Наследование: пример использования class Entity{ protected: std::string name; Entity* parent; public: virtual std::string ToString() const = 0; Entity* GetParent() const{ return parent; } }; class Folder: public Entity{ std::list<Entity*> childs; public: Folder(std::string n, Entity* p) : name(n), parent(p){} std::string ToString() const { return name; } };
  • 7. Виртуальные функции Виртуальной функцией класса называют метод, который может быть переопределён в потомке таким образом, что конкретная реализация функции для вызова будет определяться во время исполнения. Виртуальные функции являются одной из основ реализации динамического полиморфизма. Пример: class Base{ public: Base(): value(0){} virtual void show() { std::cout << "Base" << std::endl; } }; class Derived: public Base{ public: Derived() : Base() {} virtual void show() { std::cout << «Derived" << std::endl; } };
  • 8. Виртуальные функции: пример полиморфизма class Base{ public: Base(): value(0){} virtual void show() { std::cout << "Base" << std::endl; } }; class Derived: public Base{ public: Derived() : Base() {} virtual void show() { std::cout << "Derived" << std::endl; } }; void print(Base* p) { p->show(); } int main(){ Base* b = new Base(); Derived* d = new Derived(); print(b); print(d); return 0; }
  • 9. Виртуальные функции: абстрактные классы Если базовый класс только декларирует существование виртуального метода, но не предполагает его реализации, то такой метод называется чистым виртуальным или абстрактным. Класс, содержащий хотя бы один абстрактный метод, называется абстрактным классом. Любая абстрактная функция должна быть определена в дочернем классе. Абстрактные классы используются в том случае, когда программист хочет определить семейство классов с одинаковым поведением. struct Shape{ virtual void Draw() = 0; virtual void Hide() = 0; }; struct Point: Shape{ virtual void Draw(){ // draw this point } virtual void Hide(){ // hide this point } }; Абстрактные классы очень похожи на интерфейсы из Java и C#
  • 10. Перегрузка операций полезно переопределить некоторый оператор для класса, тогда запись программы становится более компактной и понятной. Общая форма определения оператора выглядит следующим образом: <return_type> operator <operator_sig n> (<operator_parametres>); для определения, где лучше всего определить оператор - внутри класса или вне его, - спросите себя, изменяет ли этот оператор свои входные параметры. Если изменяет - то этот оператор - часть класса. Если не изменяет, то оператор лучше всего определить вне класса. сlass int_pair{ int first, second; public: int_pair(int f = 0, int s = 0): first(f), second(s) {} bool operator == (const int_pair& p) const { return (first == p.first) && (second == p.second); } }; bool operator != (const int_pair& p1, const int_pair& p2){ return !(p1 == p2); }
  • 11. Функциональные объекты Если в классе переопределен оператор (), то объекты этого класса получают свойства функций (их можно использовать как функции). Такие объекты называются функциональными или функторами. Функторы удобно использовать, когда функция должна обладать "памятью", а также, как замена указателей на функции. // функтор, подсчитывающих количество вызовов class _swap{ static size_t counter = 0; static void increment() { ++counter; } public: _swap(){} void operator ()(int& a, int& b){ int tmp = a; a = b; b = tmp; inc(); } int getNrCalls() {return count; } }; _swap swap; int a = 3, b = 5; swap(a, b);
  • 12. шаблоны   Шаблонами классов называется семейство классов с одинаковым поведением Шаблонами функций называют семейство функций с одинаковым поведением template<class TYPE> void swap(TYPE& p1, TYPE& p2){ TYPE tmp = p1; p1 = p2; p2 = tmp; } Понятие шаблона функции часто ассоциируется с понятием алгоритма
  • 13. Шаблоны: статический полиморфизм int main(){ int i1 = 3, i2 = 5; float f1 = 1.2, f2 = 2.3; double d1 = 1.003, d2 = 10; swap(i1, i2); swap(f1, f2); swap(d1, d2); return 0; }  Одно и то же имя функции используется с различными типами данных. Данное свойство называется статическим полиморфизмом, потому что определение поведения функции выполняется на этапе компиляции программы.
  • 14. Шаблоны: специализация шаблонов Для какого-то типа данных можно указать специальную версию шаблона. template<> void swap(int* a, int* b){ int tmp = *a; *a = *b; *b = tmp; } Если шаблон (его специализация) не используются в программе, то на этапе компиляции он(а) не включается в бинарный код!
  • 15. С++11: автоматические типы  Ключевое слово auto предписывает компилятору самому определить тип переменной auto val = 5;
  • 16. С++11: инициализаторы  Появилась возможность инициализировать классы-контейнеры при помощи списков инициализаций. class Array10{ int _val[10]; public: Array10(std::initializer_list <int> list); }; Array10 a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
  • 17. С++11: лямбда-функции лямбда-выражения позволяют программистам ускорить написание кода. Под лямбдавыражениями понимают специальный способ записи функторов. [](int x, int y) { return x + y; } // то же, что и [](int x, int y) -> int{ int result = x + y; return result; } struct sum{ int opertator()(int x, int y){ return x+y;} };
  • 18. C++11: нулевой указатель  Использование в качестве нулевого указателя значения 0 в некоторых случаях приводило к опасному коду. Рекомендуется использовать ключевое слово nullptr void test(int); void test(char*); int main(){ test(0); // ??? test(nullptr); // !!! return true; }
  • 19. С++11: цикл «для каждого» int a[5] = {1, 2, 3, 4, 5}; for(auto& el: a){ ++el; } for(auto el: a){ std::cout << el << " "; } В новом стандарте С++ предлагается новая форма записи цикла for: for( type element: collection){}