(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 - кушает указатели на функции или функторы
Есть разные 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 - проверяет что вычисляется в момент компиляции
За жизнь Rust - язык без стандарта, свой компилятор языка без стандарта создать невозможно, тк то, как работает компилятор разработчика языка и является фактически стандартом. Переменные и Операторы int a, b = 5; // переменная a не инициализируется Инициализуется только переменные те у которых стоит = Локальные переменные без инициализации содержат мусор (рандомное значение), тк под локальные переменные место на стеке выделяется, но ничем не заполняется, может случиться 0, может не 0, из разных запусков - может случиться разное, из разных компиляций (release/debug) может случиться разное. Вообще, ошибки обращения к неиницилизированным переменным - это очень частые ошибки.
Jul 20, 2023За жизнь Сначала будет много про Си, тк Си++ - исходно расширение языка си: изначально он был как предпроцессор, который превращал его в си код, который потом компилировался - это был не отдельный язык, а надстройка над си. Потом C++ разошелся с си, некоторые вещи работают по-другому. Но в общем С++ можно считать надмножеством языка си, многое, что работает в си, работает и в ++. Идея - языка C/C++. Почему важно? - сильно влияет на проиходящие, стиль и т.д. Си относиться к одним из самых старых яп которые живы: старше си только фортран. Фортран создавался как язык для научных вычеслений, напрмер в нём легко работать с матрицами и т.д. А на си удобнее работать с системными функциями. Фортран часто используется в вычеслительных серверах. На нём написано много ПО, по этому яп до сих пор жив. Отметим, что ЯП бывают разные, так, например, Паскаль и вовсе создавался для обучения. -Для чего создавался си? -Системными программистами для себя.
Jul 20, 2023(23.04.2022) Про шаблоны Это не функция! это пример как создать что-либо! допустим есть a.h файл в котором мы реализуем функцию, и ещё b.h, b.cpp и main.cpp. Допустим мы подклюаем a.h в b.h и main.cpp, при линковке возникает ошибка Про структуры в С++ В C++ в структурах можно реализовывать функции (методы)
Sep 18, 2022(19.03.2022) Про размеры Тип для размера массивов или чего либо другого - size_t - модификатор %z (%zu - стандарт C99) ptrdiff_t - для разницы двух указателей (size_t со значком) - модификатор %t (%ti или %td стандарт C99) (Данный тип описан в заголовочном файле stddef.h для языка C и в файле cstddef для языка C++) Обратный цикл для size_t: for(size_t x=N; x--; )
Sep 18, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up