- •1.1.1 Пример программы, выводящей текст на экран (пример 1)
- •1.1.2 Директивы препроцессору (подключение заголовочных файлов)
- •1.1.3 Комментарии
- •1.1.4 Функции
- •1.1.5 Ввод и вывод на экран
- •1.2. Переменные и их объявление
- •1.2.1 Пример программы cложения целых чисел (пример 2)
- •1.2.2 Переменные и их объявление
- •1.3. Арифметические операторы
- •1.3.1 Примеры арифметических операций (пример 3)
- •1.3.2 Группировка подвыражений с помощью скобок
- •1.4. Логические выражения и оператор if
- •1.4.1 Условные конструкции. Пример условных конструкций (пример 4)
- •1.4.2 Логические выражения. Логические операции и, или, не (пример 5)
- •1.4.3 Типичные ошибки
- •1.4.4 Вложенные условия
- •1.5. Арифметический логический оператор (пример 6)
- •1.6. Селективные конструкции
- •1.6.1 Селективные конструкции. Пример определения оценки в зависимости от количества баллов (пример 6)
- •1.6.2 Оператор Switch. Пример меню с выбором действия (пример 7)
- •1.7. Циклы while и do…while
- •1.7.1 Цикл с предусловием while. Пример возведения в степень в цикле (пример 8)
- •1.7.2 Цикл с постусловием do...While
- •1.8. Пошаговый цикл for
- •1.8.1 Пример работы оператора for - вычисление суммы чисел (пример 9)
- •1.8.2 Пошаговый цикл for
- •1.8.3 Операторы break и continue
- •1.8.4 Пример вычисление факториала (пример 10)
- •1.9. Функции
- •1.9.1 Использование функций библиотеки stl (пример 11)
- •1.9.2 Определение новых функций
- •1.9.3 Пример функции (пример 12)
- •1.10. Размещение программ и данных в памяти
- •1.11. Ссылки и указатели
- •1.11.1. Ссылки
- •1.11.2. Указатели
- •1.11.3. Передача параметров в функцию по ссылке и указателю
- •2.2 Организация ввода/вывода
- •2.3 Строковые переменные и константы
- •2.4 Математические функции
- •3.1. Массивы
- •3.1.1. Одномерный массив
- •3.1.2. Динамическое размещение одномерного массива
- •3.1.3. Передача массива в функцию (пример 3.1)
- •3.1.4. Двумерный массив
- •3.1.5. Динамическое размещение двумерного массива (пример 3.2)
- •3.2 Контейнеры
- •3.3. Вектор vector (пример 3.3)
- •4.4. Список list
- •3.4.1. Списки
- •3.4.2. Итераторы
- •3.4.3. Пример работы со списком с использованием итераторов (пример 3.4)
- •3.5. Очереди и стек
- •3.5.1. Двусторонняя очередь deque (пример 3.5)
- •3.5.2. Стек stack
- •3.5.3. Очередь queue
- •3.6. Ассоциативные контейнеры
- •3.6.1. Контейнер map (пример 3.7)
- •3.6.2. Контейнер set (пример 3.8)
- •3.7. Алгоритмы
- •4.1 Структуры
- •4.1.1. Пример 4.1. Структура для работы с компонентами цвета
- •4.1.2. Передача абстрактных типов в функцию
- •4.1.3. Создание функций-членов для абстрактного типа данных. Пример 4.2. Структура для работы с компонентами цвета со встроенной функцией.
- •4.2. Классы
- •4.2.1. Пример 4.3. Класс Линза
- •4.2.2. Директивы препроцессору # if ! defined, # endif (проверка на повторное подключение)
- •4.2.3. Тип доступа к членам класса
- •4.2.4. Принципы объектно-ориентированного проектирования
- •4.2.5. Типы функций-членов класса
- •4.3 Конструкторы и деструкторы класса
- •4.3.1. Конструкторы
- •4.3.2. Деструктор (пример 4.4. Конструктор и деструктор класса Матрица)
- •4.3.3. Проверка правильности параметров. Исключительные ситуации
- •4.4. Модификаторы, селекторы и другие члены классов
- •4.4.1. Модификаторы и селекторы
- •4.4.2. Ключевые слова const и inline
- •4.4.3. Функции-утилиты
- •4.4.4. Сохраняемость
- •5.1. Типы наследования. Видимость членов классов
- •5.1.1. Наследование
- •5.1.2. Пример 5.1. Линза и зеркало как оптические детали
- •5.1.3. Последовательность вызова конструкторов
- •5.1.4. Типы наследования. Видимость членов классов
- •5.1.5. Множественное наследование
- •5.2. Виртуальные функции. Абстрактные классы
- •5.2.1. Виртуальные функции
- •5.2.2. Абстрактные классы
- •6. Полиморфизм
- •6.1. Перегрузка функций
- •6.1.1. Перегрузка функций
- •6.1.2. Преобразование типов
- •6.1.3. Параметры функций по умолчанию
- •6.2. Перегрузка операторов
- •6.2.1. Пример 6.1 (класс Complex (комплексное число))
- •6.2.6. Перегрузка операторов с присваиванием
- •6.2.7. Перегрузка преобразования типов
- •6.2.8. Перегрузка оператора доступа по индексу
- •6.2.9. Перегрузка операторов ввода/вывода
- •6.2.10. Неперегружаемые операторы
- •6.3. Шаблоны функций и классов
- •6.3.1. Шаблоны функций. Пример 6.2 (шаблон функции)
- •6.3.2. Шаблоны функций с несколькими параметрами. Пример 6.3 (шаблон функции с несколькими параметрами)
- •6.3.3. Шаблоны классов. Пример 6.4 (шаблон класса Комплексное число)
- •6.4. Объекты-функции. Предикаты
- •6.4.1. Объекты-функции. Пример 6.5 (использование объектов-функций)
- •6.4.2. Предикаты. Пример 6.6 (использование предикатов)
6.4.2. Предикаты. Пример 6.6 (использование предикатов)
Предикаты позволяют без изменения шаблона изменять критерии сравнения элементов контейнера и другие подобные действия. У предикатов объект-функция возвращает значение bool.
В файле <functional> уже определено несколько полезных предикатов:
equal_to бинарный предикат равенства
not_equal_to бинарный предикат неравенства
greater бинарный предикат >
less бинарный предикат < (используется по умолчанию)
greater_equal бинарный предикат >=
less_equal бинарный предикат <=
logical_and бинарный предикат И
logical_or бинарный предикат ИЛИ
logical_not унарный предикат НЕ
Например, стандартный алгоритм сортировки сортирует по возрастанию, если мы хотим сделать сортировку по убыванию – можно использовать предикат greater:
// сортировка в порядке убывания
sort(v.begin(), v.end(), greater<int>());
Можно определять свои предикаты, как наследники от стандартных объектов-функций.
Пример 6.6. Использование предикатов
/////////////////////////////////////////////////////////////////////////////
// Прикладное программирование
// Пример 6.6. Использование предикатов
//
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// СПб НИУ ИТМО
/////////////////////////////////////////////////////////////////////////////
#include <functional>
#include <numeric>
#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// создание объекта-функции для заполнения случайными числами
// функция Rand - шаблон, наследник от стандартной функции unary_function
// параметры шаблона: PAR - тип данных, void - возвращаемое значение оператора ()
template <class PAR>
class Rand : public unary_function<PAR, void>
{
// диапазон случайных чисел
PAR m_min, m_max;
public:
// конструктор, в котором задается диапазон случайных чисел
Rand(PAR min, PAR max)
: m_min(min), m_max(max)
{ }
// перегруженный оператор вызова функции, в котором число value заполняется случайным числом
void operator() (PAR& value)
{
value=(PAR)(rand()*(m_max-m_min))/RAND_MAX+m_min;
}
};
/////////////////////////////////////////////////////////////////////////////
// создание объекта-функции определения попадания числа в диапазон
// функция InRange - шаблон, наследник от стандартной функции unary_function
// параметры шаблона: int - тип данных, bool - возвращаемое значение оператора ()
class InRange : public unary_function<int, bool>
{
// диапазон чисел
int m_left, m_right;
public:
// конструктор, в котором задается диапазон
InRange(int left, int right)
: m_left(left), m_right(right)
{}
// перегруженный оператор вызова функции, в котором определяется
// попадание числа value в диапазон от m_left до m_right
bool operator() (const int& value)
{
return (value>m_left && value<m_right);
}
};
/////////////////////////////////////////////////////////////////////////////
// тестирование предикатов
void main()
{
vector<int> v(10);
// заполнение контейнера случайными числами при помощи объекта-функции Rand
for_each(v.begin(), v.end(), Rand<int>(-10, 10));
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout<<endl;
// сортировка с использованием предиката greater
sort(v.begin(), v.end(), greater<int>());
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout<<endl;
// использование InRange для подсчета количества элементов в диапазоне от 0 до 10
cout << count_if(v.begin(), v.end(), InRange(0, 10));
cout<<endl;
}
/////////////////////////////////////////////////////////////////////////////
Приложение 1. Приоритет операций в С++
Приоритет операций - очерёдность выполнения операций в выражении, при условии, что в выражении нет явного указания порядка следования выполнения операций (с помощью круглых скобок).
Если операции имеют одинаковый приоритет, то очерёдность выполнения таких операций определяется согласно свойству ассоциативности.
Ассоциативность - направление выполнения операций в случае, если операции имеют одинаковый приоритет.
В таблице показаны основные операции в С++, их приоритет выполнения и ассоциативность.
Приоритет |
Операция |
Ассоциативность |
Описание |
1 |
:: |
слева направо |
унарная операция разрешения области действия |
[ ] |
операция индексирования |
||
() |
круглые скобки |
||
. |
обращение к члену структуры или класса |
||
-> |
обращение к члену структуры или класса через указатель |
||
2 |
++ |
слева направо |
постфиксный инкремент |
— |
постфиксный декремент |
||
3 |
++ |
справа налево |
префиксный инкремент |
— |
префиксный декремент |
||
4 |
* |
слева направо |
умножение |
/ |
деление |
||
% |
остаток от деления |
||
5 |
+ |
слева направо |
сложение |
- |
вычитание |
||
6 |
>> |
слева направо |
сдвиг вправо |
<< |
сдвиг влево |
||
7 |
< |
слева направо |
меньше |
<= |
меньше либо равно |
||
> |
больше |
||
>= |
больше либо равно |
||
8 |
== |
слева направо |
равно |
!= |
не равно |
||
9 |
&& |
слева направо |
логическое И |
10 |
|| |
слева направо |
логическое ИЛИ |
11 |
?: |
справа налево |
условная операция (тернарная операция) |
12 |
= |
справа налево |
присваивание |
*= |
умножение с присваиванием |
||
/= |
деление с присваиванием |
||
%= |
остаток от деления с присваиванием |
||
+= |
сложение с присваиванием |
||
-= |
вычитание с присваиванием |
||
13 |
, |
слева направо |
запятая |
Если не уверены в очередности выполнения операций в выражении, указывайте явно очерёдность выполнения операций, то есть расставьте круглые скобоки.
Приложение 2. Основные типы данных
В языке С++ объявление переменных можно делать в любом месте программы.
int i; //объявление переменной и определение ее типа (declaration) i=1; // инициализация (initialization) int j=1; //объявление, определение, инициализация переменной int i,j; //объявление нескольких переменных одного типа
При назначении типа данных для переменной определяются:
объем памяти, отводимый для ее хранения;
диапазон значений, который эта переменная может принимать.
Название типа (type) |
Ключевое слово (keyword) |
Размер (size) |
Диапазон значений (limits) |
логический |
bool |
1 byte |
true/false |
символьный |
char |
1 byte |
-128 ÷ 27 |
беззнаковый символьный |
unsigned char |
1 byte |
0 ÷ 255 |
широкий символный |
wchar_t |
2 byte |
-32768 ÷ 32767 |
короткий целый |
short |
2 bytes |
-32768 ÷ 32767 |
беззнаковый короткий целый |
unsigned short |
2 bytes |
0 ÷ 65535 |
целый |
int |
4 bytes |
-2147483648 ÷ 2147483647 |
беззнаковый целый |
unsigned int |
4 bytes |
0 ÷ 4294967295 |
длинный целый |
long |
4 bytes |
-2147483648 ÷ 2147483647 |
беззнаковый длинный целый |
unsigned long |
4 bytes |
0 ÷ 4294967295 |
вещественный |
float |
4 bytes |
(±)1.175494351е–38 ÷ (±)3.402823466е+38 |
вещественный с двойной точностью |
double |
8 bytes |
(±)2.2250738585072014е-308 ÷ (±)1.7976931348623158е+308 |
длинный вещественный |
long double |
8 bytes |
(±)2.2250738585072014е-308 ÷ (±)1.7976931348623158е+308 |
пустой |
void |
– |
– |
Поэтому к назначению типов переменных нужно подойти очень ответственно:
чтобы программа во время выполнения не требовала большого объема памяти;
чтобы значения, которые могут возникать при решении задачи не превышали диапазон, не возникало переполнение (overflow).
Во время работы при инициализации или присвоении значения переменной одного типа переменной дркгого типа может потребоваться операция преобразования типа переменной. При преобразовании (conversation) возможно расширение (повышение типа) и понижение типа.
float f=0.5f; int i=(int)f; //понижение типа (операторная запись в стиле С) double d=double(f); //повышение типа (функциональная запись в стиле С++)
Следует обратить внимание, на особые типы данных С++:
bool flag; //логический тип данных может принимать два значения (true/false) wchar_t wchar; //двухбайтовый символьный тип данных (для работы в кодировке UNICODE) void func(); //пустой тип данных (для создания функций не возвращающих значений и преобразования указателей)
Оператор sizeof позволяет определить размер памяти в байтах, необходимый для хранения переменной данного типа.
int i=sizeof(int); // i=4
При определении типов переменных используются несколько ключевых слов-модификаторов:
auto; //класс памяти автоматический const; //неизменяемая величина extern; //внешнее объявление registr; //класс памяти регистровый signed; //знаковый тип (используется по умолчанию) static; //статическая переменная unsigned; //беззнаковый тип volatile; //неизменяемая величина внутри программы
if
( условие
)
{
if
( условие
)
блок
операторов; else
if(
условие)
блок
операторов;
else
блок
операторов;
Название типа (type) |
Ключевое слово (keyword) |
Размер (size) |
Диапазон значений (limits) |
логический |
bool |
1 byte |
true/false |
символьный |
char |
1 byte |
-128 г 127 |
беззнаковый символьный |
unsigned char |
1 byte |
0 г 255 |
широкий символный |
wchar t |
2 byte |
-32768 г 32767 |
короткий целый |
short |
2 bytes |
-32768 г 32767 |
беззнаковый короткий целый |
unsigned short |
2 bytes |
0 г 65535 |
целый |
int |
4 bytes |
-2147483648 г 2147483647 |
беззнаковый целый |
unsigned int |
4 bytes |
0 г 4294967295 |
длинный целый |
long |
4 bytes |
-2147483648 г 2147483647 |
беззнаковый длинный целый |
unsigned long |
4 bytes |
0 г 4294967295 |
вещественный |
float |
4 bytes |
(±)1.175494351е-38 г (±)3.402823466е+38 |
вещественный с двойной точностью |
double |
8 bytes |
(±)2.2250738585072014е-308 г (±)1.7976931348623158е+308 |
длинный вещественный |
long double |
8 bytes |
(±)2.2250738585072014е-308 г (±)1.7976931348623158е+308 |
пустой |
void |
- |
- |
Условные конструкции
if(условие) {
блок операторов;
}
else
{
}
Селективные конструкции
switch(переменная)
{
case целая константа:
блок операторов; break;
case целая константа:
блок операторов; break;
default:
блок операторов;
}
Циклические конструкции
Цикл с предусловием |
Цикл с постусловием |
Остальные ключевые слова C++ |
|
|
while(условие) |
do |
asm |
mutable |
this |
{ |
{ |
auto |
namespace |
try |
блок операторов; |
блок операторов; |
catch |
operator |
typedef |
} |
} while( условие); |
class |
private |
typeid |
Пошаговый цикл |
|
const |
protected |
typename |
|
|
enum |
public |
union |
for(инициализация; условие; модификация) |
explicit |
unsigned |
||
{ |
|
register |
||
блок операторов; |
|
export |
return |
using |
} |
|
extern |
signed |
virtual |
|
|
friend |
static |
volatile |
break - оператор досрочного выхода из |
continue - оператор досрочного |
goto |
struct |
|
цикла |
перехода к следующему шагу цикла |
inline |
template |
|
Оператор (operator) |
Назначеие (meaning) |
Тип |
Порядок |
|||||
|
|
|
оператора |
выполнения |
||||
|
|
|
(type) |
(associativity) |
||||
|
область видимости (scope resolution) |
unary |
- |
|||||
[ ] |
доступ к элементам массива |
unary |
слева направо |
|||||
|
|
(array subscript) |
|
|
||||
( ) |
вызов функции (function call) |
multiple |
слева направо |
|||||
type( ) |
оператор преобразования типов, |
unary |
- |
|||||
|
|
конструирования значения |
|
|
||||
|
|
(conversion, constructor) |
|
|
||||
|
-> |
операторы доступа к членам гетерогенных типов данных (member selection) |
unary |
слева направо |
||||
++ |
— |
постфиксный инкремент/декремент (postfix increment/decrement) |
unary |
- |
||||
new |
Динамическое размещение в памяти |
binary |
- |
|||||
|
|
переменных и массивов (allocate) |
|
|
||||
delete |
delete [] |
удаление из памяти переменной/массива, размещенного динамически (deallocate) |
binary |
|
||||
|
-- |
префиксный инкремент/декремент (prefix increment/decrement) |
unary |
- |
||||
|
* |
получение значения по указателю (dereference) |
unary |
- |
||||
|
& |
получения указателя на переменную (address-of) |
unary |
- |
||||
+ |
унарный плюс (unary plus) |
unary |
- |
|||||
|
- |
арифметическое отрицание |
unary |
- |
||||
|
|
(arithmetic negation) |
|
|
||||
|
! |
отрицание/логическое НЕ |
unary |
- |
||||
|
|
(logical NOT) |
|
|
||||
|
|
побитовое дополнение |
unary |
- |
||||
|
|
(bitwise complement) |
|
|
||||
sizeof |
определение размера переменной (size of object) |
unary |
- |
|||||
typedef |
определение имени типа (type name) |
unary |
- |
|||||
(type) |
приведение типов (type cast) |
unary |
справа налево |
|||||
const cast dynamic cast reinterpret cast static_cast |
приведение типов (type cast) |
unary |
|
|||||
* |
->* |
получение указателя на член класса (pointer to class member) |
unary |
слева направо |
||||
* |
/ |
умножение/деление (multiplication/division) |
binary |
слева направо |
||||
О, % |
остаток от деления (remainder) |
binary |
слева направо |
|||||
+ |
- |
сложение/вычитание (addition/subtraction) |
binary |
слева направо |
||||
<< |
>> |
побитовый левый/правый сдвиг (left/right shift) |
unary |
слева направо |
||||
< > |
<= >= |
сравнение (comparison) |
binary |
слева направо |
||||
|
!= |
равенство/неравенство (equality/inequality) |
binary |
слева направо |
||||
& |
побитовое И (bitwise AND) |
binary |
слева направо |
|||||
Л |
побитовое исключающее ИЛИ (bitwise exclusive OR) |
binary |
слева направо |
|||||
| |
побитовое ИЛИ (bitwise OR) |
binary |
слева направо |
|||||
|
|| |
логическое И/ ИЛИ (logical AND/OR) |
binary |
слева направо |
||||
? : |
арифметическая условная конструкция (ariftnetic if) |
ternary |
справа налево |
|||||
= |
присваивание (assignment) |
binary |
справа налево |
|||||
|
/= |
умножение/деление с присваиванием (multiplication/division assignment) |
binary |
справа налево |
||||
О %= |
остаток от деления с присваиванием (modulus assignment) |
binary |
справа налево |
|||||
+= |
|
сложение/вычитание с присваиванием (addition/subtraction assignment) |
binary |
справа налево |
||||
<<= |
>>= |
побитовый левый/правый сдвиг с присваиванием (left/right shift assignment) |
binary |
справа налево |
||||
|
побитовое И с присваиванием (bitwise AND assignment) |
binary |
справа налево |
|||||
|= |
побитовое ИЛИ с присваиванием (bitwise inclusive OR assignment) |
binary |
справа налево |
|||||
Л= |
побитовое исключающее ИЛИ с присваиванием (bitwise exclusive OR assignment) |
binary |
справа налево |
|||||
throw |
генерация исключения |
unary |
- |
|||||
|
разделитель (comma) |
unary |
слева направо |
|||||
