42. C++ Умные указатели. Smart pointers.

Умные указатели. Smart pointers. В языке C++ одной из главных проблем являются утечки памяти, для упрощения работы с ними используются умные указатели. По сути умный указатель – шаблонный класс в конструкторе которого «захватывается» указатель на область в динамической памяти, а в деструкторе область освобождается. В чем смысл? Как известно деструктор вызывается при выходе из зоны […]

41. C++ Шаблоны классов / обобщенные классы ().

Шаблоны классов / обобщенные классы. Аналогично шаблонных функций в C++ можно создавать шаблонные классы, т.е. классы, которые конструируются на этапе компиляции. template<typename T> class MyClass { public:     MyClass(T value) {this->value=value;}     void PrintValue() {cout<<value<<endl;}     T getValue(){return this->value;} private:     T value; }; В функции main: MyClass<int> c_Int(10); MyClass<string> c_String(«Hello»); c_Int.PrintValue(); c_String.PrintValue(); Используя шаблон […]

C++ Пространства имен namespace

Пространства имен namespace Иногда при написании кода, особенно разными программистами могут использоваться одинаковые названия функций и переменных, чтобы не было конфликтов их можно «облачить» в пространство имен (namespace) это что-то вроде «принадлежности» к чему либо. Например создадим пространства имен FirstNS и SecondNS внутри которых будут как одинаковые, так и разные имена функций/переменных/классов. namespace FirstNS { […]

C++ Перечисляемый тип enum

Перечисляемый тип enum Иногда нужно создать перечисления состояний или набор констант, для более удобного обращения используется перечисляемый тип enum, по сути это структура/класс созданная только для целочисленных значений, ну или же набор define т.к. при компиляции произойдет замена enum на числа. Синтаксис для enum: enum NameEnum {          CONST_0, // CONST_0=0          CONST_1, // CONST_1=CONST_0+1=1 […]

40. C++ Генерируем свои исключения. Свой класс exception

Генерируем свои исключения. Свой класс exception Как было показано ранее для обработки исключений может использоваться базовый класс exception, но в ряде случаев требуется расширить его функционал или написать для собственного класса или типов данных, поэтому создается класс-наследник от этого базового класса: class MyException : public exception { public:     MyException(char* msg, int codeError) : exception(msg) […]

39. C++ Несколько блоков catch.

Несколько блоков catch. Иногда мы можем иметь несколько вариантов возвращаемого значения у throw, для них мы можем написать несколько различных блоков catch для обработки исключений try { func(); } catch (const int Exception_code) { //обработка ошибки 1 } catch (const char* Exception_code) { //обработка ошибки 2 } catch (const exception& ex) { //обработка ошибки 3 […]

38. C++ Генерация исключений с++. Throw c++

Генерация исключений с++. Throw c++ При работе блока try catch могут генерироваться и бросаться исключения с ключевым словом throw, мы также можем его использовать в своих функциях, методах и тд. Например: void func () { int Ex_code; code1() {      // если ошибка      Ex_code=1;      throw Ex_code; } code2(){ // если ошибка Ex_code=2; throw […]

37. C++ Обработка исключений. Блоки try catch

Обработка исключений. Блоки try catch При выполнении кода могут возникать ошибки, некоторые из них м.б. трудно прогнозируемыми, маловероятными и тд, чтобы программа не вылетала, а выдавала осмысленный результат что произошло и используются блоки обработки исключений (причин почему программа не работает). Для этого используется блок try catch, рассмотрим на примере как он работает: try { code1(); […]

36. C++ Перегрузка операторов ввода/вывода

Перегрузка операторов ввода/вывода Классы cin/cout и ifstream / fstream, ofstream, являются наследниками классов ostream/istream, поэтому можем использовать следующие перегрузки для public полей string Name; и unsigned int age; класса Person; Person c_Person; ostream& operator <<(ostream& os, const Person& c_Person) {     os<<”Name: ”<<c_Person.Name<<”\n”;     os<<”Age: ”<<c_Person.age<<”\n”;;     return os; } istream& operator <<(istream& is, Person& c_Person) { […]

C++ Работа с файлами

Работа с файлами В C++ для работы с файлами используется библиотека «fstream» благодаря ней мы можем создать классы (ifstream, fstream, ofstream), являющиеся потомками класса istream/ostream и позволяющие работать с потоками ввода/вывода (в данном случае под словом поток имеется в виду поток Байт). Примечание: cin/cout итакже являются наследниками класса istream/ostream. #include <fstream> Для ввода русских символов […]