Try   HackMD

12 лекция - C++

(14.05.2022)

Комментарии

НЕ надо выделять 10 байт динамически

НЕ надо читать посильвольно

Нужно ставить ограничение на количество вводимых символов

Плюсовые штучки

struct My
{//описывает тип, здесь нет никакого реального объекта
	int x = 2;	//добавляется во все конструкторы в качестве инициализации (как после :)
		//например через malloc конструктор не вызывается (plasment new Для последующего выделения конструктора)
	int y;
};
struct My
{//описывает тип, здесь нет никакого реального объекта
	int x, y;
	My (int a, int b) : x(a), y(b) {}
	My (double b) : x (b*10), y (1) {}
	explicit My (int a) : x(a), b(0) {} //не будет вызываться через =

};

My z(2, 3); //первый конструктор
My z = 4.0;	//второй конструктор
//My z = 4; //Ошибка
My z(4); 	//третий конструктор

int a = z;
struct My
{//описывает тип, здесь нет никакого реального объекта
	int x, y;
	My (int a, int b) : x(a), y(b) {}

	operator int() {return x+y;} //оператор приведения типа к int
	explicit operator bool() const {return x!=0;} //оператор приведения типа к bool
	//приведение к bool распространенн
	// не приведет к конвериям в другие типы
	// не меняет My, кроме mutable полей
};

int a = z;	//скомпилируется, будет вызван int 

if(z)	//скомпилируется
{

}

float b = z; //будет вызван int, если бы не было explicit у bool, нескомпилировалось
struct My
{
	int x, y;
	int operator[] (int a) {return a+x;}	//можно указать любой тип, не только int
	// например int operator[] (string a) {return a+x;}
	int operator[] (int a, int b) {return a+b+x;}	//в 23 стандарте можно будет 
};


int a = z[10]; //12
int b = z[10, 3]; //15	//c 23 стандарта
int c = z[10, 3]; //3 //до 23 стандарта, будет задипликейтен 

int x = 10, 3; //в x записывается 10, потом 3 и отдается результат последнего присваения

if () x = 0, y = 3;
	//int i,j - перечисление переменных 
	//i++, j++ - оператор ,
for (int i, j; f(); i++, j++);

//В си++ разрешили создавать переменные в условие if

if(int a = 3) {} //в си нельзя так

if(int a = 3; float b = f()) {} // вноовом стандарте, if будет по второй инициализации //пременные будут внутри if и else

if (auto x = f(); x && g()) {}  //будет учитываться то, что после ;

10 //int
10u //unsigned int
10ull //unsigned long long

10_my //operator user literal который получает значение до _, в качестве long или string

L"ABC" 	// массив из char_t
u8"ABC" // 1-4 char на каждый символ как в utf-8

Функторы и лямбда функции

Классы в которых определен оператор вызова функции

struct My
{
	int  i;
	My(int a = 0) {i = a;}
	int operator() (int a) {return a+i;} //можно использовать обьект My как функцию
	int operato() (int a) 
};

My x;
My y(2);

int a = x(3); //3
int b = y(3); //5

Лямбда функции - это функторы без названия

auto z = [](int a)	//безымянный функтор без полей
{
	return a+2;
};

//по умолчанию метод const

int i = 3;
auto x = [=](int a){return a+i;};	//все внешние переменные копируются , в момент создания, менять их нельзя, внешние массивы ПОЛНОСТЬЮ копируются! 
auto x = [=](int a) mutable{return a+i;};	//все внешние переменные копируются, в момент создания, менять можно


auto y = [&](int a){return a+i;};	//ссылка на внешние переменные
auto y = [&, i](int a){return a+i;};	//ссылка на внешние переменные, i копируется


// тип возвращаемого значения не указан и вычисляется автоматом компилятором, если не получиться - не скомпилируется

auto z = [=](int a) -> double //возвращает double
{
	return a;
};

// забираются только те переменные к которым лямбда функция обращается, забираются как поля обьекта (оги будут помнить изменения)

//std:function - кушает указатели на функции или функторы

Constexpr

Есть разные const, в момент компиляции и нет

int main(int argc, char **argv)
{
	int i = 10;
	const int j = 10;
	const int k = argc;
	//constexpr int p = argc; //не скомпилируется
	// должно быть вычисленно в момент компиляции
	int a [i];	//VLA
	int b [j]; 	//VLA в си, не VLA в си++
	int c [k]; 	//VLA


}

constexpr int mymax(int x, int y)	//функция которая может иниц constexpr
//подходит для иниц в момент компияции
{
	return (x > y) x : y;
}

//consteval - проверяет что вычисляется в момент компиляции