2. Ключевые слова override и final. Удаленные функции. Псевдонимы. Перечисления с областью видимости. Объекты и функции constexpr
Описание файла
PDF-файл из архива "2. Ключевые слова override и final. Удаленные функции. Псевдонимы. Перечисления с областью видимости. Объекты и функции constexpr", который расположен в категории "". Всё это находится в предмете "проектирование больших систем с++" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Проектирование больших систем наC++Коноводов В. А.кафедра математической кибернетики ВМКЛекция 215.09.2017Пример с тестаЗадача. Напишите код, который удалит из вектора int-овэлементы, равные 0.Пример с тестаЗадача. Напишите код, который удалит из вектора int-овэлементы, равные 0.Чем плохо решать задачу так:for (auto i = v.begin(); i < v.end(); ++i) {if ((*i) == 0) v.erase(i);}Пример с тестаЗадача. Напишите код, который удалит из вектора int-овэлементы, равные 0.Чем плохо решать задачу так:for (auto i = v.begin(); i < v.end(); ++i) {if ((*i) == 0) v.erase(i);}Вариант решения:v.erase(std::remove(v.begin(), v.end(), 0),v.end());Еще один пример с тестаЗадача.
Что напечатает программа:class Base {public:void f() { std::cout << "Base :: f" << std::endl; }virtual ~Base() {}};class Derived: public Base {public:void f() { std::cout << "Derived :: f" << std::endl; }};int main() {Base* b = new Derived;b->f();delete b;}Еще один пример с теста, усложнимclass Base {public:Base() { f(); }virtual void f(int a = 1) {cout << "Base::f " << a << endl;}~Base() { cout << "~Base" << endl; }};class Derived: public Base {public:Derived() { f(); }virtual void f(int b = 2) { cout << "Derived::f " << b << endl;}~Derived() { cout << "~Derived" << endl; }};int main() {Base* b = new Derived;b->f();delete b;}Вывод типов шаблонов (в прошлый раз)Случай 1.
Тип параметра — указатель или ссылка:template <typename T>void f(T& param);Ссылочная часть игнорируется.Вывод типов шаблонов (в прошлый раз)Случай 1. Тип параметра — указатель или ссылка:template <typename T>void f(T& param);Ссылочная часть игнорируется.Случай 2. Передача по значению:template <typename T>void f(T param);Cсылочная часть игнорируется. Если после этого остаетсяconst, то он тоже игнорируется.Ключевое слово overrideГде ошибки?struct A {virtual void foo();void bar();};struct Bvoidvoidvoid};: A {foo() const override;foo() override;bar() override;Ключевое слово overrideГде ошибки?struct A {virtual void foo();void bar();};struct Bvoidvoidvoid};: A {foo() const override; // ошибка, не совпадают сигнатурыfoo() override; // okbar() override; // ошибка, A::bar не виртуальнаКлючевое слово overrideПерекрытие функций:IIФункция базового класса должна быть виртуальнойВ базовом и производном классе должны совпадать:IIIIимена функций,типы параметров,константность,возвращаемые типы и спецификации исключений.Ключевое слово finalПрепятствие перекрытияstruct A {virtual void foo() final; // запрет переопределения функцииvoid bar() final; // ошибка, так как функция не виртуальна};struct B final : A { // от структуры B нельзя отнаследоватьсяvoid foo(); // ошибка: A::foo - final};struct C : B { // ошибка, B – final};Удаленные функцииНекопируемый класс:template <typename T>class TConfig {private:TConfig(const TConfig&);TConfig& operator=(const TConfig&);};Удаленные функцииНекопируемый класс:template <typename T>class TConfig {public:TConfig(const TConfig&) = delete;TConfig& operator=(const TConfig&) = delete;};Удаленные функцииIУдаленной может быть любая функция (не толькофункции–члены класса).IПолезное применение — предотвращение использованияненужных инстанциирований шаблонов.Псевдонимыtypedef:typedefstd::shared_ptr<std::map<std::string, std::string> >TMyPtr;typedef bool (*FPtr)(int, int);Псевдонимыtypedef:typedefstd::shared_ptr<std::map<std::string, std::string> >TMyPtr;typedef bool (*FPtr)(int, int);using (C++11):using TMyPtr =std::shared_ptr<std::map<std::string, std::string> >;using FPtr = bool (*)(int, int);В чем отличие typedef от using?Псевдонимыtypedef:typedefstd::shared_ptr<std::map<std::string, std::string> >TMyPtr;typedef bool (*FPtr)(int, int);using (C++11):using TMyPtr =std::shared_ptr<std::map<std::string, std::string> >;using FPtr = bool (*)(int, int);В чем отличие typedef от using?Объявление псевдонимов поддерживает шаблонизацию.scoped enumerationsenum Color {black, white, blue};bool white; // error!scoped enumerationsenum Color {black, white, blue};bool white; // error!C++11:enum class Color { red, green = 20, blue };Color r = Color::blue;switch (r) {case Color::red: // ...case Color::green: // ...case Color::blue: // ...}int n = r; // ошибкаint n = static_cast<int>(r);scoped enumerationsenum Color {black, white, blue};bool white; // error!C++11:enum class Color { red, green = 20, blue };Color r = Color::blue;switch (r) {case Color::red: // ...case Color::green: // ...case Color::blue: // ...}int n = r; // ошибкаint n = static_cast<int>(r);Базовый тип — int.constexprconst int a = 10;const int b = std::numeric_limits<int>::max();const int c = INT_MAX;constexprconst int a = 10;const int b = std::numeric_limits<int>::max();const int c = INT_MAX;int a;const int b = a; // okconstexpr auto s = a; // errorconstexprconst int a = 10;const int b = std::numeric_limits<int>::max();const int c = INT_MAX;int a;const int b = a; // okconstexpr auto s = a; // errorconstexpr int f() {return 1024;}constexpr-функция должна состоять из одного return (C++11),возвращать константу или вызывать такую же функцию.Вычисление должно производиться во время компиляции (саргументами, значения которых известны во времякомпиляции).Пример: проверка простоты числа вcompile-timeconstexpr bool is_div(int a, int b) {return (b == 1) || (a % b != 0 && is_div(a, b - 1) );}constexpr bool is_prime(int number) {return number != 1 && is_div(number, number / 2);}int main() {static_assert(is_prime(29) , " 29 is not prime");static_assert(is_prime(36) , " 36 is prime");return 0;}ЗадачаНаписать constexpr-функцию Size, которая позволит сделатьтак:int a[5];double b[Size(a)];Другие особенности C++11Iперемещение, move-конструкторы и rvalue-ссылки;Ilambda-выражения;Iновые контейнеры: tuple, array, unordered_set,unordered_map, ...;Iумные указатели unique_ptr, shared_ptr, ...;I...ЗадачаРеализуйте класс ComplexNumber так, чтобы компилировалсяследующий код:constexpr ComplexNumber Conjugate(const ComplexNumber& x) {ComplexNumber res;res.SetRe(x.GetRe());res.SetIm(-x.GetIm());return res;}int main() {constexpr ComplexNumber a(1, 2);constexpr ComplexNumber b(1, -2);constexpr auto c = Conjugate(a);static_assert(b == c, "failed");}.