Оператор sizeof
Оператор запятая (,)
Управляющие конструкции
1. if (bool-expression) statement;
2. while (bool-expression) statement;
3. for (Выражение инициализации, выполняемое только раз; Условие выхода, проверяемое в начале каждой итерации; Выражение цикла, выполняемое в конце каждой итерации) statement;
4. switch
5. break;
6. continue;
перейти к следующей итерации цикла
7. return expression;
8. goto _(метка)_ ; устаревшее, почти не используется
Виды ошибок и UB
Указатели
Указатели на функции
int f(double, char*) //в функциях можно не указывать названия переменных
int (*p) (double, char*) = &f;
Функции с переменным числом аргументов
void f(int x, … ) { }
Аргументы по умолчанию
void f (int x, char y = ‘a’);
Перегрузка (перезагрузка) функций
Пример:
void f (int x);
int f (char x, int y);
char f(double z);
Пример:
void f (int x, int y)
void f (int x, …)
при вызове f (1,2) будет выбрана первая функция
Операторы new и delete
new type; // возвращается указатель на эту переменную (адрес)
int *p = new int ( ____ ); // эта переменная будет существовать даже после исполнения функции
delete p;
Пример:
int *p = new int [100];
delete[] p; // для уничтожения массива обязательно нужны []
Еще пример:
int *p = new int [100];
int *pp = new int [10];
delete[] p, pp; //в данном примере массив pp не уничтожится, так как оператор запятая имеет самый низкий приоритет действия
Ссылки (references)
Пример 1:
type x;
type &y=x; // это ссылка на x, без & создался бы новый объект y (а не ссылка на старый)
Пример 2:
void swap (int &x, int &y) {
int t = x;
x=y;
y=t;
}
Пример 3 :
int &f (int x) { // это пример UB - компилятор будет работать некорректно
int y = x + 1
return y;
}
Константы
const int x = 3; // данный префикс означает, что x не должен меняться (запрещены модифицирующие операции)
const int &t = y; // t и y будут один и тот же объект, при этом t будет считаться константой, а y не константой… к у можно применять модифицирующие операции, а к t нельзя… и при изменении y будет изменяться t, потому что это один и тот же объект
const int *p = ….; // указатель на константу - он сам не является константой и его можно модифицировать, а то, что под ним лежит, нельзя
const int *p = new int [10]; //такая запись допустима, мы не сможем менять ВСЕ элементы под p, а сам p сдвигать можно
Операторы явного преобразования типов
Именованный оператор приведения имеет следующую форму:
имя_приведения < тип> ( выражение ) ;
где тип - это результирующий тип преобразования, а выражение - приводимое значение. Если тип - ссылка, то результат l-значение. Имя_приведения может быть одним из следующих: static_cast, dynamic_cast, const_cast и reinterpret_cast.
1 способ:
(type) (выражение); // вычисляется выражение, а потом преобразуется в заданный тип - так было в C (c-style cast)
2 способ:
static_cast (выражение);
3 способ:
reinterpret_cast < > ( )
*(reinterpret_cast (&obj));
4 способ:
Пример 1:
int x=5;
const int &y = x;
int &z = const_cast (y);
Пример 2:
f (int&) и f (const int&); //заданы две функции (перегрузка)
f (const_cast (x)); такое выражение вынудит компилятор вызвать “f (const int&);” версию функции
5 способ:
dynamic_cast
Явное преобразование типов это “молоток”: static_cast это наиболее “ласковый” метод, reinterpret_cast это совсем хардкорные преобразование типов (лом)… c-style cast это худший вариант каста, “бульдозер” (сломать всё, лишь бы получилось)
Вывод: нужно стараться использовать касты пореже
Классы и структуры
Пример 1:
class C; //объявление класса
Пример 2:
class C {
// внутри класса находятся поля или методы (по умолчанию они считаются private)public: // всё, что написано после считается public
}; // после определения класса нужно ставить ; после фигурной скобки!!! (тонкий момент)
Что находится внутри класса:
Для того, чтобы разграничить методы и поля, которые видны и не видны внешнему пользователю, используются слова private и public (модификаторы доступа) и этим класс отличается от структуры.
Обычно сначала показывают public часть, потом private (code-style).
Пример 3:
struct s {
// в структуре всё по умолчанию public (наследование по умолчанию тоже публичное)
int x;
};
В остальных аспектах классы и структуры это одно и то же
Конструктор
Пример 1:
class tStudent{
int age // private
public:
tStudent (int _age) // конструктор
{
age = _age;
}
~tStuden () // деструктор
{
cout << “Пока!”;
}
}; // в конце должна быть ; !!!
Как вызвать конструктор:
tStudent s2(17); // специфический тип инициализации, без “=”
tStudent s3(s2); // конструктор с клонированием
_________________________________________
int main ( ) {
C x; // инструкция по созданию типа создается с помощью конструктора
}
Конструктор (пишется внутри класса)
С ( ….. ) { … }
Пример 2: (класс строк)
class string {
chat* str;
int size;
string (cons char* str_, int size_) {
str = new char [size_];
for (…)
}
};
Деструктор
~ string ( ) {
delete [] str;
};
Конструктор копирования
команда, чтобы не писать каждый раз std
using namespace std;
Включить русские символы
setlocale(LC_ALL, “Rus”);
Escape последовательности
вставлять внутрь кавычек, в любую часть текста
cout<< “ . . . “
Типы данных