Лекции (13) (Презентации лекций (PDF))
Описание файла
Файл "Лекции (13)" внутри архива находится в папке "Презентации лекций (PDF)". PDF-файл из архива "Презентации лекций (PDF)", который расположен в категории "". Всё это находится в предмете "практикум (прикладное программное обеспечение и системы программирования)" из 4 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Введение в С++11(стандарт ISO/IEC 14882:2011 )Вне рассмотрения в рамках курса остаются нововведения для работыс шаблонами: ведение понятий лямбда-функций и выражений, внешние шаблоны, альтернативный синтаксис шаблонных функций, расширение возможностей использования угловых скобок в шаблонах, typedef для шаблонов, шаблоны с переменным числом аргументов, статическая диагностика, изменения в STL, регулярные выражения.Не рассматриваются также новые понятия тривиального класса, класса с простым размещением, explicit перед функциями преобразования, новшества в ограничениях для union, новые строковые литералы, новые символьные типы char16_t и char32_t для хранения UTF-16 и UTF-32символов, некоторое другое...1Введение в С++11(стандарт ISO/IEC 14882:2011 )Полностью новый стандарт поддерживаюткомпиляторы g++ начиная с версии 4.7. …Для компиляции программы в соответствии с новымстандартом в командной строке в качестве опциикомпилятору g++ надо указать:-std=c++0x (или в новых версиях -std=c++11 ) :g++ ………….
-std=c++0x(или g++ ………… -std=c++11)2Введение в С++11rvalue- ссылкиВ С++11 появился новый тип данных – rvalue-ссылка:<тип> && <имя> = <временный объект>;В С++11 можно использовать перегруженные функции длянеконстантных временных объектов, обозначаемых посредствомrvalue-ссылок.Например:class A; … A a; …void f (A & x);~ f (a);void f (A && y);~ f ( A() );…A && rr1 = A();// A && rr2 = a; // Err!int && n = 1+2;n++;…3Введение в С++11Семантика переноса (Move semantics).При создании/уничтожении временных объектов неплоскихклассов, как правило, требуется выделение-освобождениединамической памяти, что может отнимать много времени.Однако, можно оптимизировать работу с временнымиобъектами неплоских классов, если не освобождать ихдинамическую память, а просто перенаправить указатель на неев объект, который копирует значение временного объектанеплоского класса (посредством поверхностного копирования).При этом после копирования надо обнулить соответствующиеуказатели у временного объекта, чтобы его конструктор ее незачистил.Это возможно сделать с помощью перегруженных конструкторакопирования и операции присваивания с параметрами – rvalueссылками.
Их называют конструктором переноса ( moveconstructor) и операцией переноса ( move assignment operator).При этом компилятор сам выбирает нужный метод класса, еслиего параметром является временный объект.4Введение в С++11Семантика переноса (Move semantics).Пример:class Str {char * s;int len;public:Str (const char * sss = NULL); // обычный конструктор неплоского классаStr (const Str &); // традиционный конструктор копированияStr (Str && x) { // move constructors = x.s;x.s = NULL; // !!!len = x.len;}Str & operator = (const Str & x); // обычная перегруженная операция =Str & operator = (Str && x) { // move assignment operators = x.s;x.s = NULL; // !!!len = x.len;return *this;}~Str(); // традиционный деструктор неплоского класса5Str operator + ( Str x);...};Введение в С++11Семантика переноса (Move semantics).Использование rvalue-ссылок в описании методов классаStr приведет к более эффективной работе, например,следующих фрагментов программы:...
Str a(“abc”), b(“def”), c;c = b+a; // Str& operator= (Str &&);...Str f (Str a ) {Str b; ... return a;}... Str d = f (Str (“dd”) ); ... // Str (Str &&);6Введение в С++11Обобщенные константные выражения .Введено ключевое словоconstexpr,которое указывает компилятору, что обозначаемое имвыражение является константным, что в свою очередьпозволяет компилятору вычислить его еще на этапекомпиляции и использовать как константу.Пример:constexpr int give5 () {return 5;}int mas [give5 () + 7];// создание массива из 12// элемнтов, так можно в С++11.7Введение в С++11Обобщенные константные выражения .Однако, использование constexpr накладывает жесткиеограничения на функцию:она не может быть типа void;тело функции должно быть вида return выражение;выражение должно быть константой,функция, специфицированная constexpr не можетвызываться до ее определения.В константных выражениях можно использовать нетолько переменные целого типа, но и переменныедругих числовых типов, перед определением которыхстоит constexpr.Пример:constexpr double a = 9.8;constexpr double b = a/6;8Введение в С++11Вывод типов.Описание явно инициализируемой переменной можетсодержать ключевое слово auto: при этом типомсозданной переменной будет тип инициализирующеговыражения.Пример:Пусть ft(....) – шаблонная функция, которая возвращаетзначение шаблонного типа, тогда при описанииauto var1 = ft(....);переменная var1 будет иметь соответствующийшаблонный тип.Возможно также:auto var2 = 5; // var2 имеет тип int9Введение в С++11Вывод типов.Для определения типа выражения во время компиляции при описаниипеременных можно использовать ключевое слово decltype.Пример:int v1;decltype (v1) v2 = 5; // тип переменной v2 такой же, как у v1.Вывод типов наиболее интересен при работе с шаблонами, а также дляуменьшения избыточности кода.Пример: Вместоfor(vector <int>::const_iterator itr = myvec.cbegin(); itr != myvec.cend(); ++itr)...можно написать:for(auto itr = myvec.cbegin(); itr != myvec.cend(); ++itr) ...10Введение в С++11For-цикл по коллекции.Введена новая форма цикла for, позволяющаяавтоматически осуществлять перебор элементовколлекции (массивы и любые другие коллекции, длякоторых определены функции begin () и end()).Пример:int arr[5] = {1, 2, 3, 4, 5};for (int &x : arr) {x *= 2;} ...При этом каждый элемент массива увеличится вдвое.for (int x : arr) {cout << x << ‘ ‘;} ...11Введение в С++11Улучшение конструкторов объектов.В отличие от старого стандарта новый стандарт С++11позволяет вызывать одни конструкторы класса (такназываемые делегирующие конструкторы) из других, чтов целом позволяет избежать дублирования кода.Пример:class A {int n;public:A (int x) : n (x) { }A ( ) : A (14) { }};12Введение в С++11Улучшение конструкторов объектов.Стало возможно инициализировать члены-данные класса в областиих объявления в классе.Пример:class A {int n = 14;public:explicit A (int x) : n (x) { }A(){}};Любой конструктор класса А будет инициализировать n значением14, если сам не присвоит n другое значение.Замечание: Если до конца проработал хотя бы один делегирующийконструктор, его объект уже считается полностью созданным.Однако, объекты производного класса начнут конструироватьсятолько после выполнения всех конструкторов (основного и егоделегирующих) базовых классов.13Введение в С++11Явное замещение виртуальных функций ифинальность .В С++11 добавлена возможность (с помощью спецификатора override)отследить ситуации, когда виртуальная функция в базовом классе и впроизводных классах имеет разные прототипы, например, в результатеслучайной ошибки (что приводит к тому, что механизм виртуальностидля такой функции работать не будет).Кроме того, введен спецификатор final, который обозначаетследующее:- в описании классов - то, что они не могут быть базовыми для новыхклассов,- в описании виртуальных функций - то, что возможные производныеклассы от рассматриваемого не могут иметь виртуальные функции,которые бы замещали финальные функции.Замечание: спецификаторы override и final имеют специальныезначения только в приведенных ниже ситуациях, в остальных случаяхони могут использоваться как обычные идентификаторы.14Введение в С++11Явное замещение виртуальных функций ифинальность .Пример:struct B {virtual void some_func ();virtual void f (int);virtual void g () const;};struct D1 : public B {virtual void sone_func () override; // Err: нет такой функции в Вvirtual void f (int) override;// OK!virtual void f (long) override;// Err: несоответствие типа параметраvirtual void f (int) const override;// Err: несоответствие квалификации функцииvirtual int f (int) override; // Err: несоответствие типа результатаvirtual void g () const final; // OK!virtual void g (long);// OK: новая виртуальная функция15};Введение в С++11Явное замещение виртуальных функций ифинальность .Пример:struct D2 : D1 { // см.
предыдущий слайдvirtual void g () const;// Err: замещение финальной функции};struct F final {int x,y;};struct D : F {int z;};// Err: наследование от финального класса16Введение в С++11Константа нулевого указателя.В С++ NULL – это константа 0, что может привести кнежелательному результату при перегрузке функций:void f (char *);void f (int);При обращении f (NULL) будет вызвана f (int); ,что, вероятно, несовпадает с планами программиста.В С++11 введено новое ключевое слово nullptr для описанияконстанты нулевого указателя:std::nullptr_t nullptr;где тип nullptr_t можно неявно конвертировать в тип любогоуказателя и сравнивать с любым указателем.Неявная конверсия в целочисленный тип недопустима, заисключением bool (в целях совместимости).Для обратной совместимости константа 0 также можетиспользоваться в качестве нулевого указателя.17Введение в С++11Константа нулевого указателя.Пример:char * pc = nullptr;// OK!int * pi = nullptr;// OK!bool b = nullptr;// OK: b = false;int i = nullptr;// Err!f (nullptr);// вызывается f(char*) а не f(int).18Введение в С++11Перечисления со строгой типизацией.В С++ :перечислимый тип данных фактически совпадает с целым типом,если перечисления заданы в одной области видимости, то имена ихконстант не могут совпадать.В С++11 наряду с обычным перечислением предложен такжеспособ задания перечислений, позволяющий избежать указанныхнедостатков.