SlideShare une entreprise Scribd logo
1  sur  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){}
Спасибо за внимание!

Contenu connexe

Tendances

Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
Alex.Kolonitsky
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Mikhail Kurnosov
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
Yandex
 

Tendances (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: Базовые знания
 

En vedette

обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
metaform
 

En vedette (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
 

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

C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
Technopark
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
itc73
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
guestfc8ae0
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
Technopark
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 
презентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работампрезентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работам
student_kai
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
Technopark
 
лабораторная работа №4
лабораторная работа №4лабораторная работа №4
лабораторная работа №4
Zhanna Kazakova
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 

Similaire à особенности программирования на с++ (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.
 

Plus de mcroitor

Plus de 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){}