close

Вход

Забыли?

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

код для вставкиСкачать
18.03.2014
Программирование
с использованием C++11
Полевой Дмитрий Валерьевич
к.т.н., доцент КиК
e-mail: [email protected]
1
18.03.2014
Стандарт языка С++
Опубликовано
ISO/IEC 14882:1998 (С++98)
ISO/IEC 14882:2003
ISO/IEC 14882:2011 (С++11)
19.02.2014
2
2
18.03.2014
Поддержка C++11
MS Visual Studio 2013
GCC 4.8
compileonline.com/compile_cpp11_online.php
ideone.com
gcc.godbolt.org
liveworkspace.org
19.02.2014
3
3
18.03.2014
Си и С++
разные стандарты – разные языки
родственные языки
“плюсы” С++ не только в классах
существуют разные стандарты С++
писать С++ код можно в разном стиле
19.02.2014
4
4
18.03.2014
С++ - язык общего назначения
поддерживает низкоуровневую разработку
поддерживает абстракцию данных
поддерживает ОО программирование
поддерживает обобщенное программирование
поддерживает функциональное
программирование
19.02.2014
5
5
18.03.2014
Стандартная библиотека С++
содержит типы, константы, функции
является стандартом
включает стандартную библиотеку Си
предоставляет широкий арсенал
эффективных инструментов
19.02.2014
6
6
18.03.2014
Ключевые слова С++98
asm, auto, break, case, catch,
char, class, const, continue,
default, do, double, else, enum,
extern, float, for, friend, goto,
if, inline, int, long, new,
operator, private, protected,
public, register, return, short,
signed, sizeof, static, struct,
switch, template, this, throw,
try, typedef, typeid, union,
unsigned, virtual, void, volatile,
while
19.02.2014
7
7
18.03.2014
Ключевые слова С++11
• новые трактовки
auto, default, delete, using
• новые слова
alignas, alignof, char16_t,
char32_t, constexpr,
decltype, noexcept, nullptr,
static_assert, thread_local
19.02.2014
8
8
18.03.2014
Формат определения и инициализация
переменной
[спецификатор] Тип имяПеременной [инициализатор]
пример:
int i; // счетчик !не инициализирован!
int nStep{0}; // число шагов
int nPage(0); // число страниц
const double weight = 0.5; // вес посылки
19.02.2014
9
9
18.03.2014
Виды инициализаторов
{} C++11 – «список значений»
int nPage{0};
() C++98 – «вызов конструктора»
int nPage(0);
=
C – «присваивание значения»
int nPage = 0;
19.02.2014
10
10
18.03.2014
Типы С++
встроенные (фундаментальные, базовые и т.д.)
пользовательские
– объединения
– перечисления
– структуры
– классы
19.02.2014
11
11
18.03.2014
Логический тип
bool
принимает значения
true (истина)
false (ложь)
результат логических выражений, сравнений
пример:
bool canMove{isEmpty && (0 != countFuel)};
canMove = true;
19.02.2014
12
12
18.03.2014
Целочисленные типы
int – целое число, умолчательно знаковое
модификаторы (длинны)
short, long
модификаторы знаковости
signed – неотрицательные значения
unsigned – знаковые значения
19.02.2014
13
13
18.03.2014
Символьные типы
char – символ (например, ASCII)
wchar_t – символ Unicode (!избегать!)
char16_t – UTF-16
char32_t – UTF-32
char – от 0 до 255 или от -128 до 127
unsigned char – от 0 до 255
signed char – от -128 до 127
19.02.2014
14
14
18.03.2014
Целочисленные литералы
0x – префикс шестнадцатиричного
литерала
U – суффикс беззнакового литерала
L – суффикс long-литерала
пример:
125
19.02.2014
0x8ABCDEF
3U
3L
15
15
18.03.2014
Типы с плавающей точкой
float – одинарная точность
double – двойная точность
long double – расширенная точность
19.02.2014
16
16
18.03.2014
Литералы с плавающей точкой
‘.’ – разделитель
F – суффикс float литерала
L – суффикс long double литерала
пример:
12.5
19.02.2014
3F
3.0L
1.23E-10
78.3E-1L
17
17
18.03.2014
Пустой тип (void)
void – в качестве возвращаемого значения,
для указания, что функция ничего не
возвращает
void* – указатель на объекты неизвестного
типа
19.02.2014
18
18
18.03.2014
Диапазоны арифметических типов
тип
минимальный диапазон
char
unsigned char
signed char
int
unsigned int
double
wchar_t
[-128,127] или [0, 255]
[0, 255]
[-128, 127]
19.02.2014
[-2^15, 2^15 - 1]
[0, 2^16]
10 значащих цифр
как unsigned int
19
19
18.03.2014
Размеры арифметических типов
1 == sizeof(char) <= sizeof(short) <=
<= sizeof(long)
sizeof(int)
sizeof(float) <= sizeof(double) <= sizeof(long
double)
sizeof(T) == sizeof(signed T) ==
sizeof(unsigned T)
19.02.2014
20
20
18.03.2014
Модели данных
LP32
– int — 16 бит, long и указатель — 32 бита
– Win16 API
ILP32
– int, long и указатель — 32 бита
– Win32 API, Unix и Unix-подобные системы (Linux, Mac OS X)
LLP64
– int и long — 32 бита, указатель — 64 бита
– Win64 API
LP64
– int — 32 бита, long и указатель — 64 бита
– Unix и Unix-подобные системы (Linux, Mac OS X)
19.02.2014
21
21
18.03.2014
Типы фиксированного размера
<cstdint>
• знаковые
int8_t, int16_t, int32_t, int64_t
• беззнаковые
uint8_t, uint16_t, uint32_t, uint64_t
• не являются «настоящими типами»
– псевдонимы (typedef)
19.02.2014
22
22
18.03.2014
Характеристики
арифметических типов
• как макросы
<cstdint>
<cfloat>
<climits>
- для целых (фикс. длинна)
- для вещественных чисел
- для целых чисел
• как шаблоны
<limits>
19.02.2014
- для арифметических типов
23
23
18.03.2014
Свойства типов (пример)
#include <limits>
…
numeric_limits<int>::min()
numeric_limits<int>::is_signed
numeric_limits<int>::has_infinity
…
19.02.2014
24
24
18.03.2014
Безопасное хранение указателей
• целые
• хранение адреса или сдвига
– intptr_t, ptrdiff_t
• хранение адреса или размера
– uintptr_t, size_t
19.02.2014
25
25
18.03.2014
Выбор типа
unsigned - массив битов
signed – все остальное
требуемая точность
ограничения по использованию памяти
внешние требования
19.02.2014
26
26
18.03.2014
Рекомендуемые типы
bool
int32_t
double
unsigned char
19.02.2014
27
27
18.03.2014
Минимальная программа
/*
\brief Головная функция.
*/
int
main()
{
return 0; // Признак успеха.
}
19.02.2014
28
28
18.03.2014
Функция main
без параметров
int main()
с передачей параметров командной строки
int main(int argс, const char* argv[])
19.02.2014
29
29
18.03.2014
Ссылка (reference)
альтернативное имя переменной
инициализируется при создании
пример:
T var{0};
T& ref{var};
19.02.2014
30
30
18.03.2014
Указатель (pointer)
тип Т* - тип “указатель на Т”
переменная типа Т* содержит адрес объекта
типа Т
разыменование (косвенное обращение)
пример:
char с1 = ‘а’;
char* p = &с1; //< адрес переменной с1
char с2 = *p; //< с2 == ‘а’
19.02.2014
31
31
18.03.2014
Ноль (как адрес)
nullptr
ноль (0)
– литерал, имеет тип int
– арифметический тип или указатель
NULL
– макрос
– “в курсе” использовать запрещено
19.02.2014
32
32
18.03.2014
Нулевой указатель (nullptr)
гарантируется отсутствие объектов с адресом
указатель, который ни на что не ссылается
разыменование – ошибка времени исполнения
19.02.2014
33
33
18.03.2014
Объявление функции
тип возвращаемого значения
имя функции
список аргументов
– тип
– имя
пример:
int swap(const int lhs, const int rhs);
19.02.2014
34
34
18.03.2014
Определение функции
объявление в котором присутствует тело
типы аргументов объявления и определения
должны совпадать
рекомендуется поддерживать соответствие
имен аргументов
(могут не совпадать)
19.02.2014
35
35
18.03.2014
Определение функции
(пример)
int min(const int lhs, const int rhs)
{
return (lhs < rhs )? lhs: rhs;
}
int maxTr(const int lhs, const int rhs,
cosnt int)
{
return (lhs > rhs )? lhs: rhs;
}
19.02.2014
36
36
18.03.2014
Передача аргументов
по значению
по ссылке
* через указатель (по значению)
пример:
int min(const int lhs, const int rhs)
{
return (lhs < rhs )? lhs: rhs;
}
19.02.2014
37
37
18.03.2014
Аргумент ссылка
пример:
void swap(int& lhs, int& rhs)
{
int newLhs{rhs};
rhs = lhs;
lhs = newLhs;
}
19.02.2014
38
38
18.03.2014
Аргумент указатель
пример:
void swap(int* pLhs, int* pRhs)
{
assert(0 != pLhs);
assert(0 != pRhs);
int newLhs{*pRhs};
*pRhs = *pLhs;
*pLhs = newLhs;
}
19.02.2014
39
39
18.03.2014
Возвращаемое значение
задается инструкцией return
должно быть, если не void
неименованная временная переменная
пример:
void empty()
{
return;
}
19.02.2014
пример:
int empty()
{
int res{0};
// …
return res;
}
40
40
18.03.2014
Константность (const)
замена препроцессора
строгий контроль типов
защита данных
оптимизация
19.02.2014
41
41
18.03.2014
Константность и защита данных
инициализация в процессе выполнения
изменение не предусмотрено
компилятор пресекает попытки
потенциального изменения (проверка
присваиваний)
19.02.2014
42
42
18.03.2014
Подстановка значений
“волшебные числа”
вычисления на этапе компиляции
подстановка значений (без выделения
памяти)
#define MAX_PATH 256 // избегать
или
const int MAX_PATH(256);
19.02.2014
43
43
18.03.2014
Область видимости
объявление вводит имя в область видимости
глобальное имя
объявлено вне любого блока, область видимости
простирается от объявления и до конца содержащего
объявление файла
локальное имя
объявлено внутри некоторого блока (функция,
пространство имен, класс), область видимости
простирается от объявления и до конца блока
19.02.2014
44
44
18.03.2014
Пространства имен (namespace)
логически группирует объявления
определяет область видимости
могут быть вложенными
19.02.2014
45
45
18.03.2014
Создание пространства имен
namespace имя_пространства_имен
{
// объявления и определения
}
19.02.2014
46
46
18.03.2014
Создание пространства имен
(пример)
namespace misis
{
// Узнать число групп.
int getGroupsCount();
}
19.02.2014
47
47
18.03.2014
Доступ к именам в пространстве
доступ через оператор разрешения области
видимости ::
имя_пространства_имен::имя_члена
пример:
std::cout
19.02.2014
48
48
18.03.2014
Глобальное пространство имен
все, что не лежит в собственном пространстве
имен
доступ через :: (можно опускать)
19.02.2014
49
49
18.03.2014
using-объявление
вводит локальный синоним
using имя_пространства::имя_члена;
пример:
using std::cout;
cout << "Hello!" << std::endl;
19.02.2014
50
50
18.03.2014
using-директива
вносит все именa из заданного пространства
имен в текущее
using namespace имя_пространства;
пример:
using namespace std;
cout << "Hello!" << endl;
19.02.2014
51
51
18.03.2014
Открытость пространства имен
допускается добавление имен в пространство
имен в нескольких определениях
19.02.2014
52
52
18.03.2014
Открытость пространства имен
(пример)
// в файле parser.h
// в файле lexer.h
namespace parser
{
bool parse();
}
namespace parser
{
int getLexCnt();
}
19.02.2014
53
53
18.03.2014
Псевдоним пространства имен
используется для сокращенной записи, в т.ч.
для уточнения имен
не может использоваться для повторного
открытия пространства имен
19.02.2014
54
54
18.03.2014
Псевдоним пространства имен
(пример)
namespace american_telephone_and_telegraph
{
...
}
namespace att =
american_telephone_and_telegraph;
19.02.2014
55
55
18.03.2014
Литература (учебники С++)
• Павловская Т.А. С/С++. Программирование
на языке высокого уровня.
• Эккель Б. Философия С++ (2 тома)
• Лафоре Р. Объектно-ориентированное
программирование в C++.
• Прата С. Язык программирования C++.
Лекции и упражнения.
19.02.2014
56
56
18.03.2014
Литература (справочная, С++)
• Шилдт Г. Полный справочник по С++.
• Шилдт Г. Справочник программиста по
C/C++.
• Страуструп Б. Язык программирования С++.
Специальное издание.
19.02.2014
57
57
1/--страниц
Пожаловаться на содержимое документа